C++中的前向声明

1.前向声明的好处
1)不必要的#include会增加编译时间
2)混乱随意的#include可能导致循环#include,可能会出现编译错误

2.定义
可以声明一个类而不定义它。这个声明有时候被成为前向声明。不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能适用于:
a.定义指向类型的指针及引用。
b.用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。

class A;   
class B   
{   
public:   
A* m_a; //(不能A m_a)
static A m_a2;//这个是可以的,因为静态成员变量不占用类对象的大小,是存在静态区的,所以不影响,记住:目的是c++编译器可以确定对象的大小   
};

**3.前向声明的限制
1)不能定义前向声明类的对象
2)可以定义指向这个类型的指针或引用
3)用于声明使用该类型作为形参或者返回类型的函数。(成员函数不占类对象的大小)**

4.实例
c++编译器做的事情主要是:1.扫描符号;2.确定对象大小。
所以很多时候并不需要将类都include进来。
比如:
(1)由于所有对象类型的引用所占用的空间都是相同大的,所以c++编译器很好确认对象大小(引用的大小???)。

class string;  
class Sample  
{  
private:  
string &s;  
};

这里只需要做一个string的前向声明就可以了,不需要#include

(2)由于所有类型的指针也是相同大小的。所以与(1)类似,也可以只做前向声明就好。

(3)声明成员函数的形参或者是返回类型,也可以利用前向声明的性质。

class string;  
class foo;  
class Sample  
{  
public:  
foo foo_test(foo &);  
private:  
string &s;  
foo *f;  
};

这里,我根本没有定义一个foo类,但是还是可以这样用,因为成员函数不占类对象的大小,所以c++编译器还是可以确定对象的大小(注:换句话说是否只要C++编译器能确定对象大小即可)。
前向声明的作用在于告诉编译器这是一个在别的地方定义的类型。这样C++编译器就能生成正确的符号表了。

猜你喜欢

转载自blog.csdn.net/c243311364/article/details/81296324