模仿内置运算符的类操作返回左值有什么用

时间:2019-04-25 12:32:59

标签: c++

我正在阅读c ++入门书籍,目前正在学习类,它说,每当我们创建一个类似于内置运算符的函数时,都应返回一个左值。我不明白为什么在什么情况下返回左值会有用。以下函数应该像+ =运算符一样工作,因此,如果您给两个对象,它将返回左侧的对象(this)。

Sales_data& Sales_data::combine(const Sales_data& rhs)
{
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
}

3 个答案:

答案 0 :(得分:6)

lhs.combine(rhs).do_something_else();

仅用于将功能链接在一起。您可以随时这样做:

lhs.combine(rhs);
lhs.do_something_else();

从历史上讲,C语言中的赋值一直是一个产生价值的表达式:

int* arr = NULL;
if ((arr = (int*)malloc(sizeof(int)*n)) != NULL) {
    // use arr
}

答案 1 :(得分:4)

  

以下功能应该类似于+ =运算符

但是内置的没有combine,因此您可以使用适当的语义。

这个想法是要使类型之间具有一致性(遵循Principle_of_least_astonishment),并且内置函数也应具有一致性。

对于内置函数,我们可能还会做(或多或少很奇怪)自定义类型可能期望的事情:

int i, j;
i = j = 42; // Legal
(i = 21) = 42; // Also legal

因此,我们可能希望对实现operator =的自定义类做同样的事情:

MyClass c1, c2, c3{/*..*/};
c1 = c2 = c3;
(c1 = c2) = c3;

因此签名应为:

MyClass& MyClass::operator =(const MyClass&);

答案 2 :(得分:1)

重点是您可以链接操作

Sales_data sd{}, sd1{}, sd2{};
sd.combine(sd1).combine(sd2);