看这里:

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 &

09-04 03:03
查看更多