使用場景上的區別
頭文件:變量的聲明,函數的聲明,宏的定義,類的定義等。
源文件:變量的定義。函數的定義實現,類成員函數的定義實現等。這樣方便于我們去管理、規劃,更重要的是避免了重定義的問題。
編譯期處理方式的區別:?
頭文件:單個的頭文件不參與編譯;
源文件:每個源文件,自上而下,獨立編譯
類中的成員函數在對應的源文件中定義時,一定要加上類名作用域。
//test.h
class CTest {void fun();
};
//test.cpp
void CTest::fun();
注:
- 靜態成員屬性定義初始化在源文件中,靜態成員函數在頭文件中聲明,在源文件中定義實現要加類名:: , 關鍵字static去掉。
//test.h static void fun(); //test.cpp void CTest::fun() {}
- 虛函數在頭文件中聲明,在源文件中定義實現要加類名:: ,關鍵字virtual需要去掉。純虛函數不需要實現。
//test.h virtual void fun(); //test.cpp void CTest::fun() {}
- 純虛函數不需要實現
//test.h virtual void fun() = 0;
- const成員屬性在類的構造初始化參數列表中初始化(源文件中),在頭文件中聲明,在源文件中定義實現要加類名:: , 關鍵字const保留。
頭文件重復包含
- #pragma once:直接告訴編譯器這個文件在源文件中只包含一次,相對來說效率比較高。
- 宏判斷:#ifndef……#define……#endif
兩者的比較:
- #pragma once 直接和編譯器溝通,#ifndef基于預處理指令邏輯判斷,在大量頭文件時,編譯速度降低,耗時增加。
- 程序編譯的效率速度:#pragma once相對來說更快一些。
- #ifndef:基于邏輯宏判斷,在大量頭文件時,編譯速度降低,耗時增加,宏的名字有一定的概率會重復,導致程序邏輯錯誤。?