将复制构造函数设置为private和= delete有什么区别?

时间:2019-11-17 13:19:35

标签: c++

我已经看到很多推荐使用=delete的书籍,这是否清楚意味着什么? (使程序更具可读性),而不是说将复制构造函数设置为private是一件坏事吗? 想你的答案

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

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

1 个答案:

答案 0 :(得分:1)

这是一个相对较新的功能(在2011年C ++修订版中添加),其主要动力肯定是可读性和意图的明确性。但是,区别不仅仅在于外观。

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