为什么赋值运算符同时调用copy ctor和赋值运算符?

时间:2017-05-10 05:01:41

标签: c++ oop

这是我希望输出的代码"分配"但得到两个"复制"和"作业"。

#include <iostream>
using namespace std;

class Test
{
public:
    Test(){}
    Test(Test &t){ cout<<"\n copy ";}
    void operator = (Test t) {cout<<"\n Assignment ";}
};

void main()
{
Test t1;    //default ctor
Test t3;
t3=t1;    //Assignment 
}

如果我将代码更改为

void operator = (Test &t) {cout<<"\n Assignment ";}

我只能预期输出&#34;分配&#34;。

两者有什么区别?

3 个答案:

答案 0 :(得分:4)

不同之处在于参数t按值Test &t 传递。它调用复制构造函数来创建一个可以在函数中使用的单独的本地副本。

当您使用const Test &t时(请注意 应该<{1}}),您正在传递对原始值的引用,从而避免复制。

注意:

  • 赋值运算符的正确签名是这样的(通过return *this;满足返回值):

    Test & operator = (const Test &t);
    
  • 复制构造函数的正确的签名是:

    Test(const Test &t);
    

答案 1 :(得分:1)

void operator=(Test t) { ... }

按价值预期参数。参数t是使用复制构造函数构建的。

void operator=(Test& t) { ... }

通过引用预期参数。引用是用于调用函数的对象的别名。因此,它不会创建新对象。

答案 2 :(得分:1)

执行以下操作时:

operator = (Test t)

编译器对t1进行复制以创建t3 ....

你的意思是传递Test的引用而不是副本....

DO

void operator = (Test& t) { cout << "\n Assignment "; }

而不是

void operator = (Test t) { cout << "\n Assignment "; }