C++ 若所有参数皆需类型转换,请为此采用非成员(non-member)函数

20180314 C++ 若所有参数皆需类型转换,请为此采用非成员(non-member)函数

并不是令所有的classes支持隐式类型转换都是个不好的主意,建立数值类型时就是个意外。
假设这样创建你的有理数类(Rational class):
class Rational{
public:
  Rational(int numerator = 0,   //构造函数可以不为explicit;
           int denominator = 1);  //允许int-to-Rational隐式转换
  int numerator() const;        //分子(numerator)和分母(denominator)的
  int denominator() const;       //的访问函数(accessors)。
private:
  ... 
};


当想支持混合式算数运算,可让operator* 成为一个non-member函数,即允许编译器在每一个实参身上执行隐式类型转换:


class Rational{
  ...


};
const Rational operator*(const Rational& lhs,
                         const Rational& rhs)
{
    return Rational(lhs.numerator() * rhs.numerator(),
                    lhs.denominator() * rhs.denominator());
}


Rational oneFourth(1,4);
Rational result;
result = oneFourth * 2;   //没问题
result = 2 * oneFourth;   //当然,也没问题


在开发中,无论何时都应该尽量避免使用友元(friend)函数。因为使用友元函数所带来 的麻烦远大于其使用价值。


注意:若想为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是非成员的(non-member)。






























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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值