當程式中涉及的類較多時,標頭檔案中不恰當地包含冗餘#include,會導致程式的編譯時間增加。實時合理的使用前置宣告來代替include可以很好的解決這個問題。
假設有兩個類:class a和class b;那麼class b的標頭檔案中使用類a的不同情況可以選擇選擇 前置宣告 和 #include「a.h」
1、使用前置宣告的情況:
a. 以類a的指標或引用形式定義成員變數
b. 函式的返回值為類a或其指標(以引用做函式返回值的情況極少)
c. 函式的形參中涉及到類a
d. 定義list, vector等容器時,因為容器的初始容量是系統指定,所以不需要知道類a的大小,因此可以直接使用前置宣告
e. 初始化類模板時,例如有個模板類c,利用類a初始化它並用指標來定義乙個變數,例如c* c;此時也可以模板類的前置宣告和a的前置宣告來說明
2、使用#include「a.h」的情況:
a. 成員變數直接定義為類a
b. 類b繼承了類a
從上面的情況可以看出,大部分情況下標頭檔案中使用前置宣告即可以完成對頭檔案中所使用類的說明問題,就能滿足編譯工作,這樣低耦合度的設計可以大大降低編譯時間!
對於實現檔案(.cpp)中,只要使用的相關類來完成功能的實現,就必須#include的來包含對應的標頭檔案,除非其對應的標頭檔案中已經include的過。不論是直接使用該類還是間接通過其他類呼叫實現,都必須#include相應的標頭檔案。為此,自己編寫了乙個小的測試程式
class a
;
#include "a.h"
#include a::a()
;a::~a()
;void a::output()
b* c::testb()
void main()
在c.cpp中的test()函式實現通過b的物件呼叫類b中的成員變數a來完成輸出工作,因為b的標頭檔案中是通過前置宣告對涉及的a進行說明,所以在類c的實現中僅#include「b.h」是不夠的,還必須#include "a.h",否則無法通過編譯。
這樣做也符合程式設計中所要求的「要顯式包含所使用的類,不要間接包含標頭檔案」【詳見《大規模程式設計》】!
c 前置宣告與 include區別
當我們實現乙個類的時候,需要用到其他類的一些資訊。例如實現a類需要b類的資訊。此時有兩種情況,一是只需要知道有b類的存在 二是需要知道b類的詳細資訊或者呼叫b類的方法。例如sizeof b 第一種情況我們使用前置宣告,在標頭檔案中使用class b 注意 此時在使用b類時,只能宣告b類的指標或者引用...
C 入門教程(七十三) 前置宣告和友元宣告
小古銀的官方 完整教程 友元宣告 include 前置宣告 class b class a class b int main void 類a和類b相互使用對方的指標,由於類b在類a後面,如果沒有前置宣告的話,那麼編譯的時候,編譯器就會報錯,說類a中的型別b沒有定義。中的class b 就是類b的前置...
對類前置宣告和包含標頭檔案的一點理解
類的前置宣告 forward declaration 和包含標頭檔案 include 的區別常常會迷惑我們,特別是涉及兩個類相互包含的時候。因此我們有必要搞清楚二者的區別以及二者的適用場合。首先我們需要問乙個問題是 為什麼兩個類不能互相包含標頭檔案?所謂互相包含標頭檔案,我舉乙個例子 我實現了兩個類...