时。
例:
const Rational operator*(const Rational& rhs) const;
如果定义一个有理数类,并实现*操作符为成员函数,如上所示;那么考虑一下调用:
Rational oneHalf(1, 2);
result = oneHalf * 2; // 正确,2被隐式转换为Rational(2,1)
//编译器眼中应该是这样:const Rational temp(2); result = oneHalf * temp;
result = 2 * oneHalf; // 错误,2,可不被认为是Rational对象;因此无法调用operator*
可见,这样并不准确,因为乘法(*)应该满足交换律,不是吗?
所以,支持混合式算术运算的可行之道应该是:让operator*成为一个non-member函数,允许编译器在每一个实参
上执行隐式类型转换:
class Rational
{
... // contains no operator*
};
constRational operator*(const Rational& lhs, Rational& rhs)
{
return Rational(lhs.numerator() *rhs.numerator(),
lhs.denominator() * rhs.denominator());
}
RationaloneFourth(1, 4);
Rational result;
result = oneFourth * 2;
result = 2 * oneFourth; //这下两个都工作的很好,通过隐式转换实现
成员函数的方面是非成员函数,而不是友元函数。
可以用类中的public接口实现的函数,最好就是非成员函数,而不是采用友元函数。
请记住:
- 如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。