effective c++ 若所有参数皆需要类型转换,请为此采用non-member函数

令classes支持隐式转换通常是个糟糕的主意。但是如果发生在数值类型上,比如设计一个class用来表现有理数,允许整数隐式转换为有理数似乎很是合理

class Rational
{
public:
    Rational(int numerator = 0,int denominator = 1){}
    int numerator()const{};
    int denominator()const{};
    const Rational operator* (const Rational &rhs)const{}
private:
};
int main()
{
    Rational oneHalf(1,2);
    Rational result = oneHalf * 2;
    ///Rational result2 = 2 * oneHalf;
    ///编译错误,因为并没有函数是2.operator*(oneHalf);
    ///编译器寻找non-member operator*也没有
}

改正后

class Rational
{
public:
    Rational(int numerator = 0,int denominator = 1){}
    int numerator()const{};
    int denominator()const{};
private:
};
const Rational operator*(const Rational &lhs,const Rational &rhs)
{
    return Rational(lhs.numerator() * rhs.numerator()
                    ,lhs.denominator() * rhs.denominator());
}
int main()
{
    Rational oneHalf(1,2);
    Rational result = oneHalf * 2;
    result = 2 * oneHalf;
    ///都通过编译了
    ///但是operator*是否应该成为Rational class的一个friend函数呢
    ///operator*可以完全通过Rational的public接口完成上面任务
    ///无论何时如果可以避免friend函数就应当避免,来保证class的封装性

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值