C++類的前置宣告(二)
看完《Effective C++》條款31有感。。
假設有一個Date類
Date.h
[cpp] view plain copy class Date { private: int year, month, day; }; 如果有個Task類的定義要用到Date類,有兩種寫法
其一
Task1.h
[cpp] view plain copy class Date; class Task1 { public: Date getData(); };
其二
Task2.h
[cpp] view plain copy #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 plain copy class Date; class Task1 { public: Date d; };
會編譯錯誤,因為Date d定義了一個Date型別變數,編譯器為d分配記憶體空間的時候必須知道d的大小,必須包含定義Date類的Date.h檔案。
這是可以採用指標來代替
[cpp] view plain copy class 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
為宣告式和定義是提供不同的標頭檔案
在函式庫的設計過程中,介面的設計就要遵循上述準則。
一個介面的標頭檔案是這樣的
interface.h
[cpp] view plain copy class Date; class Address; class Email; Date getDate(); 如果客戶只用到Date類,編譯器就只會去編譯Date.h,而不去編譯Address.h,Email.h 等等檔案。 原文:https://blog.csdn.net/fallStones/article/details/6266632