C++的標頭檔案,原始檔區別
阿新 • • 發佈:2019-01-27
一、宣告與定義的區分:一個宣告就是一個定義,除非 :宣告:引入名稱定義:引入實體
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
1.它聲明瞭一個沒有詳細說明函式體的函式
2.它包含一個extern定義符且沒有初始化函式或函式體
3.它是一個包含在一個類定義之內的靜態類資料成員的宣告,它必須在最終程式的某處準確的定義一次
4.它是一個類名宣告,如class test;
5.它是一個typedef宣告。 言外之意:
1。類的宣告也就是定義
2。同時賦初值的宣告也就是定義,如int a=2;
3。類非靜態資料成員的宣告也就是定義???
4。類的所有成員函式的宣告也就是定義 一個定義就是一個宣告,除非:
1.它定義的是一個靜態資料成員
2.它定義了一個非內聯成員函式 內部連線和外部連線:
typedef宣告的型別也是內聯結。 非內聯成員函式(包括靜態成員)有外部連線,非行內函數,非靜態自由函式(非類的成員函式)也是外連線。
1。類成員資料的宣告,但不能賦值 2.類靜態資料成員的定義和賦值,但不建議,只是個宣告就好。
3。類的成員函式的宣告
4。非類成員函式的宣告 5.常數的定義:如:const int a=5; 6.靜態函式的定義 7.類的行內函數的定義 不能包含: 1.所有非靜態變數(不是類的資料成員)的宣告 2。 預設名稱空間宣告不要放在標頭檔案,using namespace std;等應放在.cpp中,在.h檔案中使用std::string