何时调用复制分配运算符

When is the copy assignment operator called?

本文关键字:运算符 分配 复制 调用 何时      更新时间:2023-10-16

当我读到复制构造函数和复制赋值构造函数时,我所理解的是,它们都将各自的属性一个交给另一个,并且它们都是由编译器隐式声明的(如果没有定义的话)。所以两者都必须存在,无论是否做了有用的事情。

然后我测试了这个代码:

#include <iostream>
using namespace std;
class Test {
public:
    Test () {
        cout << "Default constructor" << endl;
    }
    Test (const Test& empty) {
        cout << "Copy constructor" << endl;
    }
    Test& operator=(const Test& empty) {
        cout << "Copy assignment operator" << endl;
    }
private:
};
int main () {
    Test a;     // Test default constructor
    Test b (a); // Test copy constructor
    Test c = b; // Test copy assignment constructor
    system ("pause");
    return 0;
}

但似乎根本没有调用复制分配运算符。我尝试了三个条件:

  1. 一切都包括在内。打印出来:

    // Default constructor
    // Copy constructor
    // Copy constructor    # Why not prints out "Copy assignment operator"?
    
  2. Whitout复制赋值运算符只复制构造函数。打印出来:

    // Default constructor
    // Copy constructor
    // Copy constructor    # Why it's printed out even though I didn't define it?
    
  3. Whitout复制构造函数只复制赋值运算符。打印出来:

    // Default constructor # Why "Copy assignment operator" is not printed out?
    
  4. 仅构造函数。打印出来:

    // Default constructor # Understandable
    

所以,编译器甚至不在乎我是否定义了复制赋值运算符。上面的四个例子都没有打印出"Copy assignment operator"。那么,如果它真的存在并有意义,它是什么时候被调用的呢?

Test c = b初始化,而不是赋值。

如果你这样做了:

Test c;
c = b;

然后它会调用复制赋值操作符。