看这里:
class IntClass
{
public:
IntClass operator=(const IntClass& rhs);
IntClass();
~IntClass();
int value;
};
实现方式:
IntClass::IntClass()
{
}
IntClass::~IntClass()
{
}
IntClass IntClass::operator=(const IntClass& rhs)
{
this->value = rhs.value;
return *this;
}
如您所见,我没有返回对该类的引用。从重载=运算符的示例中,我看到人们返回了一个引用。为什么是这样?
这仍然按预期运行:
IntClass a, b, c, d;
a.value = 20;
b = c = d = a;
printf("%d", b.value);
printf("%d", c.value);
printf("%d", d.value);
产出:202020
ps我知道公众获取值(value)是不好的。
最佳答案
首先,让赋值运算符按值返回意味着您要制作一个额外的副本。该副本可能很昂贵,并且编译器通常无法淘汰它。如果我们假设副本分配和副本构造的成本大致相同,则按值返回基本上会使分配成本加倍。
其次,如果您的赋值运算符返回引用,则赋值表达式的结果是一个左值,它类似于内置的赋值运算符。如果您的赋值运算符按值返回,则表达式的结果为右值。这可能会产生有趣的结果:
void f(IntClass &lv);
void g(IntClass &&rv);
void g(const IntClass &clv);
IntClass x, y;
y.value = 10;
f(x = y); // compiles only if operator= returns IntClass &
// as non-const lvalue references cannot bind to a temporary
g(x = y); // calls g(IntClass &&) if operator= returns IntClass
// calls g(const IntClass &) if operator= returns IntClass &