C++ 前向声明
前向声明以及#include头文件两者区别:
前向声明指在A程序中引入新的类型B,但是B并不是一个完整清晰的类,因为我们只知道只是一个B类,但是我们不清楚它的具体函数接口实现以及成员变量;不能定义一个B的类型,只能使用指针和引用的方式;直到后面找到B的定义我们才真正直到B的具体实现,才可以调用它的实现方式;
相较于前向声明,使用include在某些时候会增加编译的工作量:下面我们看一下具体使用场景:
1.循环引用
class B;
class A
{
public:
B *b;
};
//文件b.h
class B
{
public:
void hello();
};
2.减少编译工作量
// a.cpp
#include <iostream>
#include "a2.h"
#include "a1.h"
class C{
public:
A a;
void h(){
a.b->hello();
}
};
int main(){
C c;
c.h();
return 0;
}
// a1.h
#include <iostream>
class B{
public:
void hello(){
std::cout << "hello !" << std::endl;
}
};
// a2.h
#include <iostream>
class B;
class A{
public:
B *b;
};
在a2.h中前向声明B,但没有使用B,第二种方式也可以在a2.h中加入#include “a1.h”,但是这样对于每个#include “a2.h”的文件,不管是否用到B,都需要编译一遍a1.h,降低编译效率。