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
相关产品推荐
相关产品推荐

