正在看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