C++前置声明
前言
在项目代码的一个头文件中看到一个空类,很奇怪。问了前辈,前辈让我去查前置声明。
了解什么是前置声明
C++ Trick:什么时候需要前置声明?--这篇文章作为初识还是不错的
假设声明都是在头文件中。
在当前头文件中前置声明了一个类名,然后在自己的类里面声明了一个私有成员变量指针,其类型是前置申明的类。
class B;
class A
{
...
private:
B *b;
};
网上也有说前置声明类只可以做返回类型、形参、指针和引用。
也没深究,但是指针和引用一定是可以的,因为引用基于指针,而指针类型的前置声明在公司的项目中已经使用那么久了(笑)。
前置声明的作用
网络上众说纷纭,有的说可以有效的减少需要包含的头文件的数量,有的说可以节省编译的时间。
问了前辈,让我自己根据前置声明的代码结构思考,但是也指了一个方向QT的d_ptr。
前置声明的结构
-
我们可以看到它首先在前面声明了一个类,虽然没有在目前的代码中实现,它的作用是告诉编译器我有这个东西,你可以继续编译。当然在链接的过程中需要在库中存在这样一个类。
-
这样一个类的指针是一个私有变量,意味着只要没有定义友元,就只能在当前类中访问这个指针指向的类。
具体的实例请参考前面提到的QT的d_ptr,里面比较详细的介绍了前置声明的具体作用。
在一个大型工程中,如果代码涉密,其他部门则会给你提供的一些封装库,这个库的接口就是前置声明的类名(我是这样理解的),上文的class A是一个公开类,调用的私有类class B就存在封装库中。而当分装库修改或更新时,不用再去编译主体程序,只需要重新链接库就行了。
QT的d_ptr中还简单的提及了C++是通过内存的偏移来访问数据的,如果不是通过指针的形式访问新的分装库,说不定就会访问到错误的数据导致程序崩溃。