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