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类对象
关注 广研部技术圈
微信扫一扫关注公众号