C++类的前置声明

 

1、API代码使用背景:类的前置声明,可以防止类间相互引用形成依赖,提高编译速度......



1、API代码使用背景:平台代码中大量使用类的前置声明,如下图所示,使用类时只给出该类的声明,但不include定义类的.h文件。



2、使用前置声明的优势

(1)防止类间相互引用形成依赖,造成编译不通过。

比如A类使用B类对象,而B类中也使用到A类对象。A.h中引用B.h,B.h中又引用A.h,编译时会报错。



如果这时使用类的前置声明,则问题解决



(2)提高编译速度

当我们在类A使用类B的前置声明时,我们修改类B时,只需要重新编译类B,而不需要重新编译a.h的(备注:在真正使用类B时,必须包含b.h,也就是说在B.cpp中使用B对象指针调用方法时必须引用声明B的头文件;使用前置声明时,必须只使用类的指针或引用)

(3)减小类的大小



类B的大小是12(在32位机子上)。

如果我们在类A中包含的是B的对象,那么类A的大小就是12(假设没有其它成员变量和虚函数)。如果包含的是类B的指针*b变量,那么类A的大小就是4,所以这样是可以减少类A的大小的,特别是对于在STL的容器里包含的是类的对象而不是指针的时候,这个就特别有用了。

3、前置声明原理

(1)为什么使用类前置声明时只能使用类型的对象或引用。

因为指针是固定大小,并且可以表示任意的类型。而引用底层也是通过指针实现。

(2)为什么使用类的前置声明可避免重新编译

如果A类如下声明



_b和get_b是A类新增加的成员变量和成员函数,A类做出修改后,A的大小改变了,以前是4,现在变成8;_a的偏移地址也改变了,以前是0,现在是4,同时A的默认构造函数和默认拷贝函数也发生改变。此时A必须进行重新编译。任何调用A类成员变量和成员函数的类的行为也因为A的变化发生改变。

假设B的定义如下

B.h使用类的前置声明



B不需要了解A类的大小或者成员的操作,这时使用类的前置声明(一种不完整的声明)则是可以的,B.h不会因A的改变而进行重新编译。

但是如果B中直接使用A类对象


    关注 广研部技术圈


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册