为什么返回const Rational而不是Rational

时间:2010-10-21 16:20:57

标签: 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); 
      }    
};

我在这里有两个问题:

  • Q1>为什么运营商*必须返回 const理性而非简单 理性
  • Q2>当我们定义一个友元函数时,我们应该关心访问修饰符吗?

2 个答案:

答案 0 :(得分:12)

  1. 因此您无法执行Rational a, b, c; (a * b) = c;

  2. 之类的操作
  3. 没有

答案 1 :(得分:10)

请注意,返回const Rational而不是Rational不仅可以防止无意义的分配,还可以移动语义(因为Rational&&不会绑定到const Rational),因此不建议使用再用C ++ 0x。

Scott Meyers就此事写了note

  

声明按值函数返回值const将   防止它们被绑定到C ++ 0x中的右值引用。   因为右值参考旨在帮助改进   C ++代码的效率,重要的是采取   考虑到const返回值的相互作用   和rvalue引用的初始化时   指定功能签名。