关于c ++:复制构造函数和赋值运算符

The copy constructor and assignment operator

如果我重写operator=,复制构造函数会自动使用新的运算符吗?同样,如果我定义了一个复制构造函数,operator=会自动"继承"复制构造函数的行为吗?


不,他们是不同的操作员。

复制构造函数用于创建新对象。它将现有对象复制到新构造的对象。复制构造函数用于从旧实例初始化新实例。实例。当按值将变量传递给函数时,不必调用它或者作为函数的返回值。

赋值运算符用于处理已经存在的对象。赋值运算符用于将现有实例更改为与右值相同,这意味着实例必须如果它有内部动态内存,则会被销毁并重新初始化。

有用链接:

  • 复制构造函数、赋值运算符等
  • C++中复制构造函数和=运算符重载:可能的公共函数吗?


否。除非定义了一个复制ctor,否则将生成一个默认值(如果需要)。除非定义运算符=,否则将生成默认值(如果需要)。它们互不使用,您可以单独更改它们。


不,它们是不同的物体。

如果您关心的是复制构造函数和赋值运算符之间的代码复制,请考虑以下术语,即copy and swap:

1
2
3
4
5
6
7
8
9
10
11
struct MyClass
{
    MyClass(const MyClass&); // Implement copy logic here
    void swap(MyClass&) throw(); // Implement a lightweight swap here (eg. swap pointers)

    MyClass& operator=(MyClass x)
    {
        x.swap(*this);
        return *this;
    }
};

这样,operator=将使用复制构造函数来构建一个新对象,该对象将与*this交换,并在函数出口释放(与旧this一起)。


不,他们不是同一个操作员。


不。

一定要看看三定律(或考虑价值时的五条规则)