一、先来看例子
今天看别人写的代码,用到了QTreeWidgetItem,这是QT自带的类,但是并没有#include<QTreeWidgetItem>
而是在头文件里写了类的声明:
然后用到这个类的函数接口:
你看用到的都是指针!
原来是因为当你在头文件声明成员变量或成员函数时,如果只需要用到某个类的指针而不需要用到类的对象,那么就可以直接只是声明一下这个类,不用include,这样可以避免编译时include编译这个类。
但是cpp实现文件里是需要include类的。
这样的方法同样适用于自己写的类:
二、再来看Google的文档说明
zh-google-styleguide.readthedocs.io/en/latest/g…
定义:
所谓「前置声明」(forward declaration)是类、函数和模板的纯粹声明,没伴随着其定义.
优点:
- 前置声明能够节省编译时间,多余的
#include会迫使编译器展开更多的文件,处理更多的输入。- 前置声明能够节省不必要的重新编译的时间。
#include使代码因为头文件中无关的改动而被重新编译多次。
缺点:
前置声明隐藏了依赖关系,头文件改动时,用户的代码会跳过必要的重新编译过程。
前置声明可能会被库的后续更改所破坏。前置声明函数或模板有时会妨碍头文件开发者变动其 API. 例如扩大形参类型,加个自带默认参数的模板形参等等。
前置声明来自命名空间
std::的 symbol 时,其行为未定义。很难判断什么时候该用前置声明,什么时候该用
#include。极端情况下,用前置声明代替includes甚至都会暗暗地改变代码的含义:// b.h: struct B {}; struct D : B {}; // good_user.cc: #include "b.h" void f(B*); void f(void*); void test(D* x) { f(x); } // calls f(B*)如果
#include被B和D的前置声明替代,test()就会调用f(void*).
- 前置声明了不少来自头文件的 symbol 时,就会比单单一行的
include冗长。- 仅仅为了能前置声明而重构代码(比如用指针成员代替对象成员)会使代码变得更慢更复杂.
结论:
- 尽量避免前置声明那些定义在其他项目中的实体.
- 函数:总是使用
#include.- 类模板:优先使用
#include.
---
参考文献
blog.csdn.net/weixin_4009…