看这里:
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
p.s我知道公众对价值的访问是不好的。
答案 0 :(得分:2)
首先,让您的赋值运算符按值返回意味着您正在制作额外的副本。副本可能很昂贵,编译器通常不能忽略它。如果我们假设复制分配和复制构造的成本大致相同,那么按值返回基本上会使分配成本增加一倍。
其次,如果赋值运算符返回引用,则赋值表达式的结果是左值,它模仿内置赋值运算符。如果赋值运算符按值返回,则表达式的结果为rvalue。这可能会产生有趣的后果:
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 &