[英]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.