一般看来,令class支持隐式转换是不好的实现。但在混合运算中更适合支持混合运算。
class Rational {
public:
Rational(int numerator = 0, int denominator = 1);
int numberator() const;
int denominator() const;
private :
...
};
先实现operator*为成员函数,那么其调用方法如下:
class Rational{
public :
const Rational operator* (const Rational& rhs) const;
...
};
Rational oneEighth(1, 8);
Rational oneHalf(1, 2);
Rational result = oneHalf*oneEighth;
result = result * oneEighth;
尝试混合运算:
result = oneHalf * 2; --> result = oneHalf.operator*(2);
result = 2 * onehalf; --> result = 2.operator*(oneHalf);
使用非成员函数
class Rational {
...
}
const Rational operator*(const Rational& lhs, const Rational& rhs);
result = 2 * oneHalf;
在条款46则是在添加了模板信息后该如何使用。
template<class T>
class Rational {
public:
Rational(const T& numerator, const T& denominator);
const T numberator() const;
const T denominator() const;
private :
...
};
template<typename T>
const Rational operator*(const Rational<T>& lhs, const Rational<T>& rhs);
编译通过,但链接不到。
定义为friend函数即可。