class MyClass {
public:
...
MyClass & operator=(const MyClass &rhs); // return MyClass&
...
}
为什么不
class MyClass {
public:
...
MyClass operator=(const MyClass &rhs); // return MyClass
...
}
是不是因为在这种情况下通过引用返回效率更高?
谢谢
//* 已更新 *
我想我发现关键原因如下:
int i1, it2, i3;
(i1 = i2) = i3; // i3 will be assigned to i1
如果 operator= 的返回类型是 MyClass 而不是 MyClass&,则以下语句的执行与内部数据类型不同。
MyClass mc1, mc2, mc3;
(mc1 = mc2) = mc3;
遵循内置类型使用的规则被认为是一种很好的做法。
// *** update ***
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i1, i2, i3;
i1 = 0;
i2 = 2;
i3 = 3;
(i1 = i2) = i3;
cout << "i1: " << i1 << endl;
cout << "i2: " << i2 << endl;
cout << "i3: " << i3 << endl;
return 0;
}
// output from VS2010
/*
i1: 3
i2: 2
i3: 3
*/
最佳答案
您所说的“为什么不”是什么意思?这真的取决于你。如果需要,您可以返回对象的拷贝而不是引用。这没什么不对,只是它可能确实被证明效率较低。
在许多情况下,人们更喜欢返回引用,因为它更接近内置 赋值运算符的语义。内置运算符返回一个左值,这意味着您可以编写如下代码
int a, b = 0;
int *p = &(a = b);
// `p` now points to `a`
不可否认,它不是很有用,但如果您想保留左值语义,您仍然需要从赋值运算符返回一个引用。
更新
您更新的示例不正确。 (i1 = i2) = i3
表达式导致未定义的行为,而不是您似乎相信的“i3 将被分配给 i1”。的确,赋值运算符返回一个左值这一事实允许您编译像 (i1 = i2) = i3
这样的表达式。但是,这个特定的表达式是无用的,因为行为是未定义的。
在用户定义赋值的情况下,如在您的 (mc1 = mc2) = mc3
示例中,行为已定义,但仍远非有用。你为什么想要做那样的事情?
关于C++——为什么 operator= 返回对 *this 的引用而不是对 *this 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5630150/