【发布时间】:2016-04-10 00:31:55
【问题描述】:
我正在实现一个分数类,并且需要重载算术运算符。
问题是,我只能实现一个const 版本吗?
例如加法:
Fraction operator+( const Fraction& other ) const;
既然非常量和常量Fraction对象都可以调用这个函数,我还需要一个非常量operator+成员函数吗?
【问题讨论】:
我正在实现一个分数类,并且需要重载算术运算符。
问题是,我只能实现一个const 版本吗?
例如加法:
Fraction operator+( const Fraction& other ) const;
既然非常量和常量Fraction对象都可以调用这个函数,我还需要一个非常量operator+成员函数吗?
【问题讨论】:
const 成员函数可以在非const 对象上调用,所以不,您不需要非const 重载。
Fraction a, b;
Fraction c = a + b; // no problem
【讨论】:
一般来说,这种问题最好用会员operator+=和非会员operator+解决,像这样:
class Fraction {
public:
const Fraction& operator+=(const Fraction&);
};
Fraction operator+(const Fraction& lhs, const Fraction& rhs) {
Fraction res(lhs);
res += rhs;
return res;
}
【讨论】:
+ 操作符来修改对象(非常量)。但这是真的,理解这一点并不明显......
没有。您可以在非const 对象上调用const 方法,就像您可以将const 引用绑定到非const 对象一样。 IOW,您始终可以将可以修改的对象传递给承诺不修改它的代码 - 不会失去安全性。反之当然不正确 - 如果你有一个 const 对象(=> 一个你承诺不会修改的对象)你不能将它传递给不遵守这个承诺的代码。
【讨论】: