我经常看到我的老师使用const operator +-*/
返回const
值。这样做是一种好习惯吗?我应该为我写的每个班级都这样做吗? (T
表示任何重载operator + - * /)的结构/类。
例如:
struct Fraction
{
//something here.
const Fraction operator+(const Fraction &rhs) const;
const Fraction operator-(const Fraction &rhs) const;
const Fraction operator*(const Fraction &rhs) const;
const Fraction operator/(const Fraction &rhs) const;
};
答案 0 :(得分:5)
不,这是一个坏主意,因为它会抑制移动语义。在以下内容中:
a = b + c;
b + c
的临时结果如果不是a
,则可以移至const
,但必须复制const
。复制通常比移动更昂贵。
从历史上看,在移动语义之前的几天,有人建议防止像(a + b) = c
这样的废话。一些人认为最好使其导致编译时错误,而不是奇怪的运行时行为。这些天,即使你同意这个论点,这样做也需要付出代价。
答案 1 :(得分:2)
返回类型的const
不需要(一般情况下,在这种情况下)。返回值是一个rvalue,修改它可能有意义,但它不能,但一般来说返回类型(按值)不是const
。这与返回引用形成对比,其中const
可以产生更大的差异。
假设正在使用C ++ 11,返回类型为const Fraction
将干扰通常的移动语义。
在考虑算术运算符(+
,-
,*
和/
)的重载时,遵循内置运算符的canonical form是推荐的。通过可修改的右值返回结果,即不是const
。对于这些运算符的assignment versions(+=
,-=
,*=
和/=
),请按引用返回值(通常为*this
})。
如下;
T T::operator+(const T2 &b) const;
// and
T& T::operator+=(const T2& b);
const
这里的成员方法很有意义,对象本身不会被改变(在一般意义上),因此将它们标记为{{1}推荐。