【问题标题】:Why do we return the object by reference when overloading << operator and not on overloading = and + operator? [duplicate]为什么我们在重载 << 运算符而不是重载 = 和 + 运算符时通过引用返回对象? [复制]
【发布时间】:2020-07-06 11:57:09
【问题描述】:

我试着查阅了这本书,发现那里的原因是运算符函数的原型要重载

friend ostream& operator<<(ostream&, const className&);

现在考虑以下语句:

cout << myRectangle << yourRectangle;

这个语句等价于语句:

operator<<(operator<<(cout, myRectangle), yourRectangle); //Line A

因为运算符

cout << myRectangle

即表达式:

operator<<(cout, myRectangle)

执行此表达式后,输出 myRectangle 的值,无论是什么 函数运算符

这意味着你不能通过值传递一个对象作为形参通过引用获取它的参数。所以对我来说为什么在重载

tempRectangle = myRectangle + yourRectangle + anyRectangle;

根据运算符的优先级和结合性,编译器会先执行:

myRectangle + yourRectangle

相当于:

myRectangle.operator+ (yourRectangle); // Line B

► 这是我的第一个困惑,在执行 B 行后,它将按值返回对象(然后由第三个对象添加,即 anyRectangle)。那么你如何根据 B 行来编写这个加法(因为我们没有任何名称返回的值返回的对象,所以它是如何执行这个加法的)。

►第二个困惑是在这个语句中添加了所有三个对象之后:

tempRectangle = myRectangle + yourRectangle + anyRectangle;

我们有一个按值返回的对象,然后将其传递给 operator= 函数以分配它 tempRectangle。现在这与

className operator+(const className&) const;

这个函数还有一个引用参数。但是我们按值传递对象作为实际参数(在重载

【问题讨论】:

  • operator= 应该通过引用返回。
  • 另外:className operator+ 经常使用className&amp; operator+= 实现

标签: c++ oop operator-overloading return-type


【解决方案1】:

正如评论中提到的 operator= 应该返回一个参考。另一方面,operator+ 不同,因为在

auto c = a + b;

operator+ 通常保持两个操作数不变,结果会创建一个新对象。例如

struct foo {
    int value;
    foo operator+(const foo& other) const {
        foo result;
        result.value = value + other.value;
        return result;
    }
};

如果你像这样链接operator+

auto c = (a + b) + c;

那么operator+(c) 既不是在a 也不是b 上调用,而是在a+b 的结果上调用。

【讨论】:

  • 但是加法的结果是如何传递给 operator= 的呢?因为 operator= 通过引用获取参数(对象),但我们通过值对象返回它传递它。我在这里很困惑:(
  • @BilalSheikh 似乎您对引用有一个普遍的困惑。您可以将对象传递给需要引用的函数,这没问题,我想您已经这样做了好几次了
  • 看看这个:int increment(int &amp;x) { return (++x);},现在如果我们这样称呼它会起作用吗int y = 0;int num = increment (increment (y));
  • 我的理解是原型应该是className&amp; operator= (const className);而不是className&amp; operator= (const className&amp;);
  • @BilalSheikh 不,这不起作用,但坦率地说,我不太明白这与运算符的返回类型有什么关系
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2012-04-23
  • 2020-07-09
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多