【问题标题】:Confused about return by reference对引用返回感到困惑
【发布时间】:2016-06-09 14:39:02
【问题描述】:

我被下面的例子弄糊涂了:

class complex {
  double re, im;
public:
  complex(double r, double i) : re{r}, im{I} ()

  complex& operator+= (const complex&z) { re += z.re; im += z.im; return *this; }
};

我不明白为什么operator += 的返回类型是引用,因为reim 正在更新。我也不明白为什么要包含*this

【问题讨论】:

  • 我不明白你为什么认为reim 的更新与返回类型有关。 return *this; 存在是因为 *this 是函数返回引用的对象。

标签: c++ return-by-reference


【解决方案1】:

也可以返回void

C++ 约定是 operator+= 返回对其左侧操作数的引用,因此您可以编写像 if((x += y) > 10) 这样的表达式。

【讨论】:

  • 能否请您解释一下为什么需要返回 if((x+=y)>10 的引用?抱歉,我对这一切都是新手。
  • @MichaelHutton 如果它返回void,那么您可以使用+= 进行加号并更新值。当它返回void 时,您无能为力。如果它返回 *this 的引用,您可以立即使用该值。如a+=b = c, or (a+=b)>c 等。它们的意思是a = a + b; a = c;和 a = a+ b; a > c.
  • 啊,现在我明白了!感谢您提供此信息
【解决方案2】:

按照惯例,我们尝试将 operator 用于类作为内置。

int i = 0;
(i += 40) += 2;

有效。

所以通过引用返回允许类。

【讨论】:

    【解决方案3】:

    第一:

    您的运算符 += 未正确声明。应该是

    complex& operator+=(complex const& other){...}
    

    第二个回答您的实际问题,您将返回 *this,因为 += 运算符是一个复合赋值运算符,它正在修改被分配变量的内部状态。因此,您返回对“this”指向的变量的引用。

    【讨论】:

    • 代码直接取自 Bjarne Stroustrup(C++ 的创造者)的《The C++ Programming Language》一书
    • 不正确?我们可以知道为什么吗? const T & 和 T const & 是一样的吧?
    • 自发布此答案以来,对问题的编辑修复了声明。
    • 减速中缺少 () 和参数,并且已被更正
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2018-11-27
    • 2015-10-19
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多