重载operator =时返回引用和值之间的区别是什么?

时间:2014-08-28 23:22:55

标签: c++ operator-overloading

看这里:

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我知道公众对价值的访问是不好的。

1 个答案:

答案 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 &