在我们看一些C++头文件的时候,经常可以看到某些类的声明但却找不到定义。如:
class abc; //仅仅声明,没有定义
通常后面还会有定义指向这个类型的指针或引用,如:
abc *pointer;
abc &pointer;
这种形式称之为类的前向声明/引用。在声明之后,定义之前,类abc是一个不完全类型(incompete type),即已知abc是一个类型,但不知道包含哪些成员。不完全类型只能以有限方式使用:
(1) 不能定义abc类的对象。
(2) 可以用于定义指向这个类型的指针或引用。
(3) 用于声明(不是定义)使用该类型作为形参或者返回类型的函数。
使用前向声明主要是为了避免添加一堆#include,因为:(1) 不必要的头文件会增加编译时间。
(2) 混乱随意的#include可能导致重复#include,从而出现编译错误。