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

C++中删除构造函数的最佳实践:应置于私有/保护/公有域?

在C++中删除构造函数的最佳实践:访问权限的选择

当你用= delete语法删除构造函数时,不同的访问权限(public/protected/private)会影响编译报错逻辑,也传递不同的设计意图,下面逐个分析三种写法的差异:

  • 方法1:放在public域

    class Foo{
    public:
        Foo() = delete;
    };
    

    这是最推荐的写法。把删除的构造函数放在对外可见的public接口里,不管是类外部代码、子类还是友元,只要试图调用这个构造函数,编译器都会直接抛出“函数已被删除”的明确错误,不会因为访问权限问题混淆开发者。这相当于直白地告诉所有人:这个构造函数就是不允许被任何代码调用,没有权限层面的模糊空间。

  • 方法2:放在protected域

    class Foo{
    protected:
        Foo() = delete;
    };
    

    这种写法下,类外部的代码调用构造函数时会先触发“访问权限不足”的错误,而子类或友元调用时才会看到“函数已被删除”的提示。只有当你需要禁止子类使用默认构造,但允许外部通过其他方式(比如静态工厂方法)创建对象时,才考虑这种写法,但实际场景中很少用到——毕竟直接public删除的表意更清晰。

  • 方法3:放在private域

    class Foo{
    private:
        Foo() = delete;
    };
    

    这种写法的问题最大:类外部调用时,编译器只会报“无法访问私有成员”,而不会说明构造函数本身被删除了。这会让开发者误以为只要调整权限就能调用,浪费调试时间。只有友元调用时才会得到“已删除”的正确提示,完全不推荐用这种写法。

总结一下:优先把删除的构造函数放在public域,这是最符合代码可读性和设计意图表达的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:33:19