【问题标题】:Returning member methods overloads by reference or not是否通过引用返回成员方法重载
【发布时间】:2020-04-03 22:23:32
【问题描述】:

所以我看到了一个视频,讨论了类中的运算符重载。这个类是一个虚构的Number 类,它实例化了实数,可以像这样使用Number first(1)Number second(2)(数字存储在一个 num 数据成员中),然后我们将运算符重载为成员方法,以便能够这样做first + second-first。这些运算符重载的代码如下所示:

PS:rhs 右侧

Number &Number::operator+(const Number &rhs) {
   //perform math calculation between both objects
   return *this;  //return lhs by reference
}

或者这个对于一元减号运算符,它只返回单个整数的减号版本(无用但用作示例):

Number operator-() {
   int temp = -num;
   return temp;//temporary
}

现在视频说如果在链式操作中使用对象,我们应该通过引用返回一个对象,在它经历了重载之后,我也听说这取决于性能(是为了避免复制吗?),但之后我仍然不确定何时在类运算符重载中通过引用返回对象。

提前致谢。

【问题讨论】:

  • 你有operator+的完整实现吗?
  • Here 你可以找到关于运算符重载一般规则的非常好的解释。通常,返回类型不应取决于运算符是作为成员函数重载还是作为非成员函数重载。在这些特定情况下,operator+operator- 应该按值返回,因为它们应该返回一个新值,而不是修改调用它们的对象。
  • 二进制非赋值操作通常不应该返回引用,它们通常也是 const,不修改它们的参数。 a+b 中的二进制加号将修改 a 并返回它。这是operator+=的策略

标签: c++ oop


【解决方案1】:

你可以调用重载的操作符:

  1. 二元算术运算:直接调用重载的运算符函数,与调用普通函数的方式相同:

    number1 + number2;              // normal expression
    operator+(number1, number2);    // equivalent function call
    

    在这种情况下,两个调用是等价的。两者都调用非成员函数operator+,将number1 作为第一个参数传递,number2 作为第二个参数传递。 二进制算术运算不会修改任何一个操作数 - 它实际上从两个参数返回一个新值。因此,您不会返回参考。

  2. 复合赋值操作:另一种选择是显式调用成员运算符函数:

    number1 += number2;             // expression-based call
    number1.operator+=(number2);    // equivalent call to a member operator function 
    

    这里,两个语句都调用成员函数operator+=,将this绑定到number1的地址,并将number2作为参数传递。因此,您将其作为参考返回。

    Number& operator+=(const Number& rhs) // compound assignment
    {                          
        /* addition of rhs to *this takes place here */
        return *this; // return the result by reference
    }
    

【讨论】:

  • 感谢您的回答,但是我仍然不明白为什么我必须在第二个示例中通过引用返回对象。
  • 好吧,复合赋值运算符允许链接。因此,要执行诸如(number1 += 1) += 2; 之类的操作,您需要将对象作为引用返回,因为该操作是在同一个对象number1 上一遍又一遍地执行的。如果 this 不是通过引用返回的,则不会在同一个对象上执行该操作。因此,总而言之,为了与内置的复合赋值保持一致,这些运算符应该返回对其左侧操作数的引用。
猜你喜欢
  • 2014-12-19
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多