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
或类似的类型,我的论点是有效的:)我同意,实际上我是想用一个移动语义何时适用的例子来扩展你的答案:)