You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求提供C++中析构函数使用friend说明符的示例

析构函数中使用friend说明符的示例与场景

当然可以!下面我会通过实际代码示例,展示如何在析构函数中使用friend说明符,同时解释这种用法的核心场景——毕竟C++标准允许这么做,肯定是有实际需求的。

核心场景:控制对象的销毁权限

通常我们把析构函数设为private,然后通过friend说明符授权特定的类或函数来销毁对象,以此严格控制类实例的生命周期,避免外部代码随意销毁对象。

示例1:友元类销毁私有析构的对象

#include <iostream>

// 前向声明管理类
class ObjectManager;

class SecretResource {
private:
    // 把析构函数设为私有,外部无法直接调用
    ~SecretResource() {
        std::cout << "SecretResource 已被安全销毁\n";
    }

    // 声明 ObjectManager 是本类析构函数的友元
    friend class ObjectManager;
};

class ObjectManager {
public:
    void manageResource() {
        // 创建资源对象
        SecretResource* resource = new SecretResource();
        // 只有 ObjectManager 能销毁它,因为它是友元
        delete resource;
    }
};

int main() {
    ObjectManager manager;
    manager.manageResource();

    // 下面两行都会编译失败,因为外部无权限访问私有析构
    // SecretResource res;
    // SecretResource* res = new SecretResource(); delete res;

    return 0;
}

这个示例里,SecretResource的析构函数是私有,普通代码既不能创建栈对象(栈对象离开作用域会自动调用析构,编译器会报错),也不能直接delete堆对象。只有被声明为友元的ObjectManager可以合法销毁它,完美实现了生命周期的管控。

示例2:友元函数销毁私有析构的对象

除了友元类,也可以授权单个全局函数来销毁对象:

class LimitedLifetimeObj {
private:
    ~LimitedLifetimeObj() = default;

    // 声明特定全局函数为析构函数的友元
    friend void safeDestroy(LimitedLifetimeObj* obj);
};

void safeDestroy(LimitedLifetimeObj* obj) {
    delete obj; // 合法,因为该函数是友元
}

int main() {
    LimitedLifetimeObj* obj = new LimitedLifetimeObj();
    safeDestroy(obj);
    // delete obj; // 编译失败,无权限调用析构

    return 0;
}

符合标准的验证

正如你提到的[class.dtor]/1规定:析构函数声明的声明说明符序列中的每个说明符只能是friend、inline或virtual。上面的示例中,我们通过friend声明授权外部实体访问私有析构,完全符合标准要求——本质上是让友元实体获得了调用析构函数的权限。

内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:44:07