使用场景
头文件A包含另一个头文件B, 是为了引入在头文件A中使用的类, 函数, 结构体, 枚举或其他实体的声明....一般来说, 只有在自己的类中将某个类的对象作为数据成员使用时, 或者需要继承某个类时, 才应该包含那个类的头文件. 传统上来说, 前置声明可以在下列情况下使用:
不需要知道类的大小....前置声明能够节省不必要的重新编译时间. #include使代码因为头文件中无关的改动而被重新编译多次.
缺点
前置声明隐藏关系, 头文件改动时, 用户代码会跳过必要的重新编译过程....前置声明可能会被库的后续更改所破坏. 前置声明函数或模板有时会妨碍头文件变动其API. 例如扩大参数类型, 加上自带默认参数的模板形参等....仅仅为了能前置声明而重构代码(比如使用指针成员代替对象成员)会使代码变得更慢更复杂.
delete一个不完整类型的指针时, 如果这个类型有non-trival的析构函数, 那么这种行为是未定义的.