effective cpp24, 46需要类型转换时请为模板定义非成员函数

一般看来,令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函数即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值