預備知識:
c++中我們cpp文件和.h文件的區別是,cpp文件是需要編譯的文件,成為一個獨立的編譯單元,而h文件從來是不需要編譯,只是用於預處理。
通常我們在cpp文件中,完成函數的實現,然后在h中則是對於函數的聲明,由於默認情況下,全局變量和全局函數存儲類型都是extern類型的,所以我們不需要顯示的使用extern
這樣,我們其他的cpp文件,只要#include .h文件,則在cpp中實現的函數,就能在其他cpp中使用,因為我們已經用.h文件,完成了extern函數聲明的操作。
c++類的定義,其實就是定義一個類型。
class A{
public:
void fun(int n);
int fun1(void);
public:
int num;
};
其實就是定義了一種類型。和我們通常所說的定義不一樣。
類的定義,是不能重復定義的,在同一個編譯單元中,只能定義類一次。如果重復定義,會出錯。同時類聲明和類定義都是內部鏈接。只是為當前編譯單元所用。
因此,把類的定義,放在.h文件中,類的實現放在專門的cpp中。這樣包含.h的其他cpp,就可以使用cpp中實現的函數。。
同時注意:類的實現cpp文件的編譯,必須依賴於類的定義文件.h,所以我們在類實現文件cpp中必須#include< ........h>,用於編譯,否則會出錯。這是不同於普通的函數。
//student.h (這是頭文件,在此文件中進行類的聲明) class Student //類聲明 { public: void display( ); private: int num; char name[20]; char sex; }; //student.cpp //在此文件中進行函數的定義 #include <iostream> #include ″student.h″ void Student∷display( ) {cout<<″num:″<<num<<endl; cout<<″name:″<<name<<endl; cout<<″sex:″<<sex<<endl; } //main.cpp 主函數模塊 #include <iostream> #include ″student.h″ int main( ) {Student stud; stud.display( ); return 0; }
類中只有static成員變量。具有外部鏈接特性。所以這要求,static成員變量的初始化一定要在.Cpp文件中。如果在h文件中。那么多個cpp文件#include,則發生多次重復定義的錯誤。
類定義和類實現分離的好處
:
1/快編譯速度
當然可以啊。相反,如果你把類的所有代碼都內聯定義到頭文件中,那么所有需要用到這個類的CPP文件實際上都包含了更多的代碼,編譯器編譯每個這樣的CPP文件時都編譯了這些代碼。而分開定義,這些代碼就只被編譯了一遍,也就是在編譯實現那個類的CPP文件時。
在特殊情況下確實可以的
假如我有一個類a被幾百個cpp同時包含,如果定義和聲明放在一起,只要我對a進行任何修改,那幾百個文件都必須被重新編譯。而如果頭文件只包含聲明,修改a的實現不會導致那些文件被重新編譯,有時可以極大的提高速度
