Effective C++ Item 24 Declare non-member functions when type conversions should apple to all parameters

1. 一般而言, 令 class 支持隐式转换不是个好主意, 但也有例外. 假如你设计一个 class 来表现有理数, 那么允许整数 "隐式转换" 到有理数就很合理. 假设一个有理数的类的实现如下

class Rational {
public:
    Rational(int numerator = 0, int denomitor = 1;)
    int numerator() const;
    int denomitor() const;
private:
    ...
};

如果你想扩展这个类, 让他支持加法或乘法操作, 你可以简单的这类函数设计成 member-function, 毕竟这种函数涉及两个有理数之间的运算, 设计成 member-function 没有不妥.

那么, 一个 member-function 乘法的实现可能会写成这样

const Rational operator*(const Rational &rhs) const {
    ....
}

然后当你尝试进行混合运算的时候, 你却发现只有一半行得通

result = oneHalf * 2; // OK
result = 2 * oneHalf; // Error

而从逻辑上来讲, 乘法应该是满足交换律的, 所以, 我们应该思考, 将乘法设计成 member function 似乎是有些不妥, 因为乘法运算的两个运算数地位应当是等价的, 这时, 一个较好的设计应该是将其设计成 non-member function

const Rational operator*(const Rational &lhs, const Rational &rhs) {
    ...
}

 

如果你需要对某个函数的所有参数进行类型转换(包括 this 所指的那个隐喻参数), 那么这个函数必须是个 non-member

Effective C++ Item 24 Declare non-member functions when type conversions should apple to all parameters,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。