为什么返回const Rational而不是Rational

q09*_*987 8 c++

我看到了运算符*的以下实现,如下所示:

class Rational {
public: 
       Rational(int numerator=0, int denominator=1);
       ...
private:
       int n, d; // numerator and denominator
       friend const Rational operator*(const Rational& lhs, const Rational& rhs)
      { 
          return Rational(lhs.n * rhs.n, lhs.d * rhs.d); 
      }    
};
Run Code Online (Sandbox Code Playgroud)

我这里有两个问题:

  • Q1>为什么operator*必须返回const Rational而不是简单的Rational
  • Q2>当我们定义一个友元函数时,我们应该关心访问修饰符吗?

Oli*_*rth 12

  1. 所以你不能做类似的事情Rational a, b, c; (a * b) = c;.

  2. 没有.

  • 简洁,翔实,准确.好答案. (2认同)

fre*_*low 10

需要注意的是返回const Rational,而不是Rational不仅防止荒谬的任务,而且移动语义(因为Rational&&不结合const Rational),并因此没有C++ 0x中推荐的做法了.

斯科特迈尔斯写了一个便条就这一问题:

声明按值函数返回值const将阻止它们绑定到C++ 0x中的右值引用.因为rvalue引用旨在帮助提高C++代码的效率,所以在指定函数签名时考虑const返回值的交互和rvalue引用的初始化是很重要的.