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)。