条款24:若所有参数皆需类型转换,请为此采用non-member函数

//令class支持隐性类型转换通常是个糟糕的主意, 但也有例外, 最常见的例外是在建立数值类型时
//以有理数类(class Rational)示例:
/**********************************************************************
class Rational
{
public:
Rational(int numerator = 0, int demomirator = 1);
int numerator() const;
int demomirator() const;
private:
...
};


//你想支持加法、乘法等算术运算,该以何种类型的函数实现呢


class Rational
{
public:
const Rational operator*(const Rational& rhs) const;
}
Rational oe(1, 8);
Rational oh(1, 2);
Rational r = oe * oh; //OK
r = r * oe; //OK
r = oh * 2; //OK, 2被隐式类型转换       => oh.operator*(2); 2发生了隐式类型转换,相当于const Rational temp(2); r = oh * temp;
r = 2 * oh; //错误,但是乘法应该满足交换率=> 2.operator*(oh);


//整数2并没有相应的class, 也就没有operator*成员函数
//编译器也会尝试寻找形如【r = operator*(2, oh);】这般调用的non-member函数( 在命名空间内,或在global作用域内 );
//于是尝试让operator*成为一个non-member函数,如下:
class Rational{};
const Rational operator*(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(), lhs.demomirator() * rhs.demomirator());
}
r = oh * 2; //OK
r = 2 * oh; //OK
***********************************************************************/


//member函数的反面是non-member函数,而不是friend函数,无论何时可以避免使用friend函数就应该使用friend函数

请记住:

》如果你需要为某个函数的所有参数(包括this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是non-member函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值