一、聲明與定義的區分:
一個聲明就是一個定義,除非 :
聲明:引入名稱
定義:引入實體
1.它聲明了一個沒有詳細說明函數體的函數
2.它包含一個extern定義符且沒有初始化函數或函數體
3.它是一個包含在一個類定義之內的靜態類資料成員的聲明,它必須在最終程式的某處準確的定義一次
4.它是一個類名聲明,如class test;
5.它是一個typedef聲明。言外之意:
1。類的聲明也就是定義
2。同時賦初值的聲明也就是定義,如int a=2;
3。類非待用資料成員的聲明也就是定義???
4。類的所有成員函數的聲明也就是定義一個定義就是一個聲明,除非:
1.它定義的是一個待用資料成員
2.它定義了一個非內聯成員函數內部串連和外部串連:
編譯時間每個檔案會被編譯成一個含有必要資訊的源檔案(又叫編譯單元),然後編譯單元會連接成一個和族檔案同名的.o檔案,.o檔案把不同的編譯單元中產生的符號聯絡起來,構成一個可執行檔。有兩種截然不同的連結:內部的和外部的,將這些編譯單元聯絡起來。
內部串連:對這個定義的訪問被局限在當前編譯單元,其他編譯單元無法訪問。
外部串連:可被其他單元訪問,因此名稱在整個執行檔案中必須唯一。
類的定義(同時也是聲明),enum,struct,都是內部串連,內嵌函式,靜態非類成員資料也是
typedef聲明的類型也是內連接。非內聯成員函數(包括靜態成員)有外部串連,非內嵌函式,非靜態自由函數(非類的成員函數)也是外串連。聲明只對當前編譯單元有用,他們不會影響到.o檔案, .h檔案,由於該檔案會被其他.cpp檔案包含,但由於聲明只是對當前編譯單元有效,是不會將符號引入.o檔案,所以該檔案不能含有任何外部串連的符號(資料成員和函數)的定義。一般情況下也不要包含內串連符號的定義。 綜上所訴:.h檔案中能包含:
1。類成員資料的聲明,但不能賦值2.類待用資料成員的定義和賦值,但不建議,只是個聲明就好。
3。類的成員函數的聲明
4。非類成員函數的聲明5.常數的定義:如:const int a=5;6.靜態函數的定義7.類的內嵌函式的定義 不能包含:1. 所有非靜態變數(不是類的資料成員)的聲明2。 預設命名空間聲明不要放在標頭檔,using namespace std;等應放在.cpp中,在.h檔案中使用std::string