繁体   English   中英

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

[英]Why does assignment operator call both copy ctor and assignment operator?

这是我的代码,我希望输出“ Assignment”,但同时获得“ copy”和“ Assignment”。

#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 ";}

我预期只有“任务”输出。

两者有什么区别?

区别在于参数Test t通过value传递t 这将调用副本构造函数来创建一个单独的本地副本,您可以在函数中使用它。

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

笔记:

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

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

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

期望参数值。 使用复制构造函数构造参数t

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

希望通过引用获得论点。 引用是用于调用函数的对象的别名。 因此,它不会创建新对象。

当您执行以下操作时:

operator = (Test t)

编译器复制 t1来创建t3...。

您的意思是通过测试的引用而不是副本。

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

代替

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM