c++——前向声明

本文介绍了C++中的前向声明和#include头文件的区别。前向声明仅告知编译器存在类B,但不提供详细信息,适用于指针和引用,而#include提供完整接口,可能导致编译速度减慢。在类A和B相互依赖时,前向声明可避免循环引用问题,但限制了直接创建类对象。文章提供了使用示例,并指出在析构未完全定义对象时可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C++中有一种使用其他类的方式:前向声明。这个的用法和#include一个头文件的方式很像,但是两者的使用有很大的区别:

前向声明以及#include头文件两者区别:

前向声明指在A程序中引入新的类型B,但是B并不是一个完整清晰的类,因为我们只知道只是一个B类,但是我们不清楚它的具体函数接口实现以及成员变量;不能定义一个B的类型,只能使用指针和引用的方式;直到后面找到B的定义我们才真正直到B的具体实现,才可以调用它的实现方式;

如果直接在程序中#include则可以直接定义这个类;

前向声明的使用场景以及限制

看起来好像直接添加头文件的方式挺好,提供了全部的接口,但是这样的代价就是增加了编译器的编译工作量,大量导入的头文件会引起编译比较慢;并且在两方循环调用的情况下,比如A和B相互调用对方,在A调用B类相关的时候,B类可能还没有定义好,那么我们只能进行前向引用,只表明这是B类就好了;

限制情况:

1、不能够定义B类的对象;

2、只可使用这个类的指针以及引用类型;

3、用于声明使用类型为形参或者返回类型的函数;

使用示范:

1、通过前向引用减少头文件的导入,提供编译的效率;

//A类的头文件

class B;
class A {
    A();
    ~A();
    B* func(B&);
}


//A类的cpp文件
#include "A.h"
#include "B.h"

//直接在代码中使用B类的对象以及成员函数、成员变量;

2、避免使用错误,以下还是按照上面的例子来实现

//A类的头文件

class B;
class A {
    A();
    ~A()
    {
        if (B_obj != NULL)
        {
            delete B_obj;
            B_obj = NULL;
       
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值