正在看google c++編程規範,裏面對頭文件依賴是這麼說的:c++
使用前置聲明(forward declarations)儘可能減小.h文件中#include的數量。 當一個頭文件被包含的同時也引入了一項新的依賴(dependency),只要該頭文件被修改,代碼就要從新編譯。若是你的頭文件包含了其餘頭文件,這些頭文件的任何改變也將致使那些包含了你的頭文件的代碼從新編譯。所以,咱們寧肯儘可能少包含頭文件,尤爲是那些包含在其餘頭文件中的。 使用前置聲明能夠顯著減小須要包含的頭文件數量。舉例說明:頭文件中用到類File,但不須要訪問File的聲明,則頭文件中只需前置聲明class File;無需#include "file/base/file.h"。 在頭文件如何作到使用類Foo而無需訪問類的定義? 1) 將數據成員類型聲明爲Foo *或Foo &; 2) 參數、返回值類型爲Foo的函數只是聲明(但不定義實現); 3) 靜態數據成員的類型能夠被聲明爲Foo,由於靜態數據成員的定義在類定義以外。 另外一方面,若是你的類是Foo的子類,或者含有類型爲Foo的非靜態數據成員,則必須爲之包含頭文件。 有時,使用指針成員(pointer members,若是是scoped_ptr更好)替代對象成員(object members)的確更有意義。然而,這樣的作法會下降代碼可讀性及執行效率。若是僅僅爲了少包含頭文件,仍是不要這樣替代的好。 固然,.cc文件不管如何都須要所使用類的定義部分,天然也就會包含若干頭文件。 譯者注:能依賴聲明的就不要依賴定義。
因而在VC下作了下測試,先自行創建Foo.h,Foo.cpp文件,裏面定義一個類CFoo,不用管怎麼定義,隨便都行,而後建議main.cpp,在裏面測試:編程
class CFoo; class test { public: /*1*/ CFoo func(CFoo foo);//ok /*2*/ static CFoo sub;//ok /*3*/ CFoo& foo1;//ok /*4*/ CFoo* pfoo1;//ok /*5*/ CFoo foo; //error };
以前都是直接include Foo.h 文件,此次不引用,而是聲明一下CFoo類。下面看test類的聲明。函數
一、正確。說明了規範中第2點,函數參數和返回值只是聲明。測試
二、正確。說明了規範中第3點,靜態數據成員的類型能夠被聲明爲Foo,由於靜態數據成員的定義在類定義以外。google
三、四、正確。5錯誤。說明了規範中第1點,非靜態的數據成員必須是指針或引用,不然須要依賴定義,其實也好理解,非靜態表示每一個實例都佔有內存,必然須要知道內存的大小,沒有定義怎麼能知道呢?spa