C++ 为什么返回常量Rational而不是Rational

C++ 为什么返回常量Rational而不是Rational,c++,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& r

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

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>为什么操作员*必须返回 保持理性而不是简单 理性的
  • 当我们定义朋友函数时,我们是否应该关心访问修饰符
  • 所以你不能做像
    Rational的a,b,c;(a*b)=c

  • 没有


  • 请注意,返回
    const-Rational
    而不是
    Rational
    不仅可以防止无意义的赋值,还可以移动语义(因为
    Rational&&
    不绑定到
    const-Rational
    ),因此在C++0x中不再推荐使用

    Scott Meyers就此事写了一篇文章:

    通过值函数声明返回值const将 防止它们绑定到C++0x中的右值引用。 因为右值引用旨在帮助改进 C++代码的效率,重要的是要 考虑常量返回值的交互作用 以及在 指定函数签名


    举一个移动语义的例子,想想
    a*b*c
    通过使用
    &&
    参数重载
    运算符*
    ,我们可以得到可破坏的临时变量来窃取资源,从而从运算符链中删除不必要的分配。@Mat:虽然
    Rational
    不太可能有任何外部资源,但是想想
    string
    或类似的类型,我的论点是有效的:)我同意,实际上我是想用一个移动语义何时适用的例子来扩展你的答案:)