正在回归" const T"来自" T :: operator +(const T& rhs)const"好的做法?

时间:2014-10-16 10:26:50

标签: c++ operator-overloading

我经常看到我的老师使用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;
};

2 个答案:

答案 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}推荐。