《Effect C++》学习------条款24 :若所有参数皆须类型转换,请为此采用non-member函数

首先还是下面这个class

class Rational{
public:
    Rational(int numirator = 0, 
             int denominator = 1);
    int numurator() const;
    int denominator() const; //    getter;
};

想要支持operator*的时候我们首先可能想到的是两种选择,一种是member operator*(),还有一种就是friend operator*().

首先,member function版本的operator*带来的问题是, rational * 2可以正常使用但是 2 * rational 却不能。

所以首先这里要说的就是,所有的参数都需要进行隐式转换的情况下,采用non-member形式会更加的契合。

再者,如果不选去member function形式的operator*,那么是采取friend方式的operator*比较好还是说采取non friend形式的operator*方式比较好呢

下面首先以非friend的方式实现了这个问题:

const Rational operator*(const Rational & lhs, const Rational & rhs)
{
     return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());
     //通过了两个getter来处理这件事
}

上面这种方式不仅可以使tmpRational * 2 以及2 * tmpRational正常通过编译,而且相对于friend函数来说,其对类的内部情况了解的更少,那么实际上他比下面的friend版本函数更加降低了耦合:

const Rational operator*(const Rational & lhs, const Rational & rhs)
{
    return Rational(lhs.numerator * rhs.numerator, lhs.denominator * rhs.denominator);
    //这里就没有使用getter来处理这件事
}

有太多的假设认为,一个与某个class相关的方法如果不是一个member function那么就应该是一个friend,实际上并不是这样,上面两种的其实上面那种确实耦合性更小。

请记住:

  • [x] 如果要为某个函数的所有参数进行类型转换,那么这个函数必须是个non-member,而如果能取得non-friend non-member效果其实更佳。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值