【问题标题】:What is the difference between setting the copy constructor to private and =delete? [duplicate]将复制构造函数设置为 private 和 =delete 有什么区别? [复制]
【发布时间】:2019-11-17 13:19:35
【问题描述】:

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

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

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

【问题讨论】:

  • 你问的是=delete还是=default
  • defalut 不是 C++ 中的关键字。如果您的意思是default,那么这个问题没有多大意义(或有一个非常快速的答案):具有不可访问的副本 c-tor 的类是不可复制的,具有默认副本 c-tor 的类是。你确定你的意思不是delete(在原始版本中)?
  • 我的英语很差...我会编辑我的问题。对不起
  • pubilc 也是您帖子中的拼写错误。

标签: c++


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2012-07-27
    • 2012-03-09
    • 2012-11-28
    • 2020-01-09
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多