前置聲明一般用於要在一個類中使用另一個類,而另一個類的聲明在后面或者其他文件中時
如類A和B
class A{
private:
B *b;
};
class B{
};這里類B在類A后面,但是類A中創建類B的指針了,所以要在類A前聲明類B,將上面改成
class B;
class A{
private:
B *b;
};
class B{
};雖然這里聲明了在類A前面聲明了類B,但是並不能在類A中創建類B的對象或者使用類B的方法
namespace就是命名空間,可以在其中定義變量和函數等等
#include<iostream>
using namespace std;
namespace A{
void Print();
}
void A::Print(){
cout<<"From namespace A"<<endl;
}
namespace B{
String a="From namespace B";
void Print(){
cout<<a<<endl;
}
}
using namespace B;
int main()
{
Print();
A::Print();
Print();
return 0;
}
上面這段程序的運行結果應該是輸出
From namespace B
From namespace A
From namespace B
主函數中第一個Print運行的是namespace B中的函數Print,因為在主函數之前有一條語句using namespace B;,這里表明了使用命名空間B,所以直接調用Print函數就是B中的,后面A::Print()則是直接使用域作用符::來訪問namespace A中的Print函數,而在這后面又直接訪問Print函數,因為域作用符只是本次有效,故第三個Print函數調用是直接訪問了namspace B中的Print函數。
假若在第三個Print函數和return 0之間加入
using namespace A;
Print();
那么就會報錯call of overloaded 'Print()' is ambiguous|
那是因為這里的using namespace A;雖然使用了A命名空間,但是實際上並不會在后面屏蔽B命名空間,所以調用Print函數就會不清楚調用的A中的還是B中的
namespacens
{
………//將內容添加到命名空間中
}
using namespace ns;
……..//聲明命名空間后,表示ns命名空間里面的內容對於這條聲明后的代碼是可見的。
但是如果聲明了兩個命名空間ns1,ns2。且ns1和ns2中包含相同的全局變量,或函數或類,那么就可能會產生沖突。
using namespace ns1;
using namespace ns2;
………//若使用了ns1和ns2中相同部分會產生沖突。
解決方法:指定命名空間。例:ns1::變量名
結構體聲明的幾種方式
1.先聲明結構體類型,再定義結構體變量
/*圖書的結構體類型聲明*/
struct Book
{
char ISBN[20]; //圖書的ISBN碼。
char name[50]; //圖書名稱。
float price; //價格
};
/*結構體變量定義*/
struct Book book1; //book1 為結構體變量。
- 2.聲明結構體類型,同時定義結構體變量
/*圖書的結構體類型聲明*/
struct Book
{
char ISBN[20]; //圖書的ISBN碼。
char name[50]; //圖書名稱。
float price; //價格
}book2; // book2 為結構體變量
/*再次定義一個結構體變量 book3 */
struct Book book3; //book3 為結構體變量。
- 3.不聲明結構體類型,直接定義結構體變量
/*圖書的結構體類型聲明*/
struct
{
char ISBN[20]; //圖書的ISBN碼。
char name[50]; //圖書名稱。
float price; //價格
}book4; // book4 為結構體變量
//但這樣聲明結構體類型后,就不可再定義新的結構體變量了。
- 4.使用typedef聲明結構體類型,再定義結構體變量
/*圖書的結構體類型聲明 typedef 方式一*/
typedef struct Book
{
char ISBN[20]; //圖書的ISBN碼。
char name[50]; //圖書名稱。
float price; //價格
}strBook; // strBook為結構體類型
/*定義一個結構體變量 */
struct Book book5; //book5 為結構體變量。
strBook book6; //book6 為結構體變量。
/*圖書的結構體類型聲明 typedef 方式二 */
typedef struct
{
char ISBN[20]; //圖書的ISBN碼。
char name[50]; //圖書名稱。
float price; //價格
}strBook; // strBook為結構體類型
/*定義一個結構體變量 */
strBook book6; //book7 為結構體變量。
在使用 typedef struct {…}strBook;聲明結構體類型時需要注意的是和直接 struct Book {}book2; 的區別,strBook 是結構體類型,而book2是結構體變量。(第4中方式二第2的區別)。在實際編碼過程中常見的方式是選用第4的方式二進行編程。
類的聲明 , 類和結構體的區別 , 內聯函數
#include<iostream>
using namespace std;
class A;//類的聲明
class B
{
private:
A *a;//必須是指針 ,不能為 A a;
};
class A
{
private:
B b;
};
int main()
{}
類和結構體區別:
結構體默認public
類默認是private
在繼承方式:結構體默認公有繼承
類默認私有繼承
inline
調用內聯函數並沒有執行函數的調用過程,只是把函數的代碼嵌入到了程序的調用點 , 減少了函數的調用過程。
一般把內聯函數寫在.h頭文件中