from
http://blog.csdn.net/fallstones/article/details/6266632
[C++]前置聲明和標頭檔
分類: C++2011-03-22 00:13 199人閱讀 評論(0) 收藏 舉報看完《Effective C++》條款31有感。。假設有一個Date類Date.h [cpp] view plaincopyclass Date { private: int year, month, day; }; 如果有個Task類的定義要用到Date類,有兩種寫法其一Task1.h [cpp] view plaincopyclass Date; class Task1 { public: Date getData(); }; 其二Task2.h [cpp] view plaincopy#include "Date.h" class Task2 { public: Date getData(); }; 一個採用前置聲明,一個採用#include<Date.h>加入了Date的定義。兩種方法都能通過編譯。但是 Task1.h 這種寫法更好。如果Date.h 的 private 成員變數改變,比如變成 double year, month, day; ,Task1.h 不需要重新編譯,而 Task2.h 就要重新編譯,更糟的是如果 Task2.h 還與其他很多標頭檔有依賴關係,就會引發一連串的重新編譯,花費極大的時間。可是事實上改變一下寫法就可以省去很多功夫。所以能用前置聲明代替#include 的時候,盡量用前置聲明有些情況不能用前置聲明代替#include比如Task1.h改成 [cpp] view plaincopyclass Date; class Task1 { public: Date d; }; 會編譯錯誤,因為Date d定義了一個Date類型變數,編譯器為d分配記憶體空間的時候必須知道d的大小,必須包含定義Date類的Date.h檔案。這是可以採用指標來代替 [cpp] view plaincopyclass Date; class Task1 { public: Date *d; }; 指標的大小是固定的。在32位機上是4位元組,64位機上是8位元組。這時編譯Task1的時候不需要Date的大小,所以和Date的定義無關。何時可以用前置聲明代替#include(http://blog.csdn.net/rogeryi/archive/2006/12/12/1439597.aspx)上述例子可以說明如果使用object reference 或 object point 可以完成任務,就不要用object這樣可以盡最大可能避免#include from http://blog.csdn.net/fallstones/article/details/6266632為聲明式和定義是提供不同的標頭檔 在函數庫的設計過程中,介面的設計就要遵循上述準則。一個介面的標頭檔是這樣的interface.h [cpp] view plaincopyclass Date; class Address; class Email; Date getDate(); 如果客戶只用到Date類,編譯器就只會去編譯Date.h,而不去編譯Address.h,Email.h 等等檔案。