1. 程式人生 > >C++類的前置宣告(二)

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