首页 > 解决方案 > 将复制构造函数设置为 private 和 =delete 有什么区别?

问题描述

我看过很多书推荐使用=delete,这只是清楚它的意思吗?(使程序更具可读性)而不是说将复制构造函数设置为私有是一件坏事?认为你的答案

class A {
  A(const A&);
  // some functions and variable

public:
  // or you can A(const A&)=delete;
  // do something
};     

标签: c++

解决方案


这是一个相对较新的功能(在 2011 年的 C++ 修订版中添加),其主要动机肯定是可读性和意图清晰。然而,区别不仅仅是化妆品。

请记住,使用类中声明的构造函数,没有什么能阻止其他翻译单元实际提供定义。在头文件中列出类的成员函数并在单独的 .cpp 中实现它们是很常见的。如果有人从类内部使用复制构造函数,编译器会抱怨缺少定义(“未定义的引用...”)。如果一个天真的程序员以某种方式得出结论,即您因为从不需要它而忘记实现它,他们可以继续这样做。突然间,您的类是可复制的,即使只能从它自己的成员函数(和朋友)中复制。这=delete构造函数可以防止这种情况,并且编译器错误更好(通常沿着“无法复制对象,因为复制构造函数被声明为已删除”而不是“未定义的引用...”或“A::A 是在这种情况下是私有的”)。


推荐阅读