【问题标题】:When is the copy assignment operator called?什么时候调用复制赋值运算符?
【发布时间】:2015-05-23 04:05:59
【问题描述】:

当我读到复制构造函数和复制赋值构造函数时,我的理解是两者都将它们的属性相互传递,并且它们都是由编译器隐式声明的(如果未定义)。因此,无论是否有用,两者都必须存在。

然后我测试了这段代码:

#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. 没有复制赋值运算符只是复制构造函数。打印出来:

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

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

    // Default constructor # Understandable
    

所以,就好像编译器根本不在乎我是否定义了复制赋值运算符。上面的四个示例都没有打印出“复制赋值运算符”。那么它是什么时候被调用的,如果它真的存在并且有意义呢?

【问题讨论】:

  • c 是新对象,所以它是复制构造

标签: c++ copy-assignment


【解决方案1】:

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

如果你这样做了:

Test c;
c = b;

然后它会调用复制赋值运算符。

【讨论】:

  • 这是否意味着Test c(b)Test c = b 相同?
  • @AndreasVennström 不,它们并不相同。它们在这段代码中都有相同的效果,但是它们是两种不同的初始化。请参阅 bit.ly/1FLauIT 并阅读有关直接和复制初始化的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2021-04-16
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多