我正在阅读c ++入门书籍,目前正在学习类,它说,每当我们创建一个类似于内置运算符的函数时,都应返回一个左值。我不明白为什么在什么情况下返回左值会有用。以下函数应该像+ =运算符一样工作,因此,如果您给两个对象,它将返回左侧的对象(this)。
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
答案 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);