请求提供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
相关产品推荐
相关产品推荐

