【问题标题】:What is the difference between declaring a copy constructor with "= default" or not declaring it at all?用“= default”声明复制构造函数或根本不声明它有什么区别?
【发布时间】:2020-10-24 16:31:04
【问题描述】:

我正在尝试了解各种功能的自动生成编译器代码的行为,例如:

  1. 析构函数
  2. 复制构造函数
  3. 赋值运算符
  4. 移动构造函数
  5. 移动赋值运算符

与未声明的情况相比,使用“= default”声明它们会导致任何功能差异吗? 这个问题的答案在上面列出的函数中是否有所不同? 如果没有功能上的差异,使用这两种情况的后果是什么?

复制用“= default”声明的构造函数

class MyClass
{
public:
    MyClass();
    MyClass(MyClass &other) = default;
    
    OtherClass some_member;
};

未声明复制构造函数:

class MyClass
{
public:
    MyClass();

    OtherClass some_member;
};

【问题讨论】:

标签: c++ memory rule-of-three rule-of-zero rule-of-five


【解决方案1】:

在某些情况下,复制构造函数被默认删除。最简单的例子:

class myClass {

public:
    myClass();
    myClass(myClass &&);
};

myClass a;

void func()
{
    myClass b=a;  // ERROR
}

我不会解释编译错误的原因,而是从我的编译器中逐字粘贴编译错误:

‘constexpr myClass::myClass(const myClass&)’被隐式声明为 删除,因为“myClass”声明了一个移动构造函数或移动 赋值运算符

显式声明默认或用户定义的复制构造函数将使代码编译。

还有其他几个原因。显式声明的复制构造函数会删除隐式声明的移动构造函数。

【讨论】:

  • 感谢您的回答 sam,定义上述 5 个函数中的任何一个会导致完全相同的编译错误吗?
  • 其中许多规则因类方法而异。
  • 类方法是什么意思?任何成员方法或 5 种方法之一?我怎样才能学习这些规则?
  • 所有或大部分这些规则都应该在每本涵盖 C++11 或更高版本的高级 C++ 教科书中进行解释。 Stackoverflow.com 并不是教科书的真正替代品,复制/粘贴解释所有这些内容的整个章节没有多大意义,不是吗?您在教科书中找到了什么解释,有什么具体的解释不清楚吗?
  • stackoverflow's list of C++ textbooks。的确,教科书不是为了“学习某一特定事物,而是一种掌握学科的好方法”。因为大概这是你的长期目标(我只学了这个主题就停止学习 C++ 对我来说没有意义),所以你需要一本教科书。 C++ 是当今使用的最复杂和最难的通用编程语言。没有人会从随机的 Youtube 视频或在线编码网站中学习 C++,而只能从教科书中学习。
猜你喜欢
  • 2013-05-21
  • 2012-07-15
  • 2013-02-03
  • 2014-11-26
  • 1970-01-01
  • 2014-06-26
  • 2018-07-03
  • 2010-11-13
  • 2019-11-05
相关资源
最近更新 更多