看完《Effective C++》条款31有感。。
假设有一个Date类
Date.h
class Date { private: int year, month, day; };
如果有个Task类的定义要用到Date类,有两种写法
其一
Task1.h
class Date; class Task1 { public: Date getData(); };
其二
Task2.h
#include "Date.h" class Task2 { public: Date getData(); };
一个采用前置声明,一个采用#include
所以能用前置声明代替#include 的时候,尽量用前置声明
有些情况不能用前置声明代替#include
比如Task1.h改成
class Date; class Task1 { public: Date d; };
会编译错误,因为Date d定义了一个Date类型变量,编译器为d分配内存空间的时候必须知道d的大小,必须包含定义Date类的Date.h文件。
这是可以采用指针来代替
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
class Date; class Address; class Email; Date getDate();
如果客户只用到Date类,编译器就只会去编译Date.h,而不去编译Address.h,Email.h 等等文件。