Item 24: 若所有参数皆需要类型转换,请为此采用non-member函数
2017-03-28 19:11
495 查看
这里的non-member函数对应的另一个函数是member函数,member函数暗含着一个this参数,所谓的“若所有参数比需要类型转换,必须采用non-member函数”的原因就在于,member函数暗含的*this参数是转换不了的!例如我们前面提到的operator应用于Rational,假如operator*是Rational的一个member函数:
从Rational类设计者的角度来看,拿一个Rational对象跟一个整数相乘应该是被允许的,这比较符合我们对它的期望,前面我们也提到,尽量让类的设计与内置类型的行为相一致。若函数设计成non-member函数,将不再受this参数限制,所以参数都可能被隐式转换,当执行时,编译器会首先在该类中查找有没有重载,然后再到命名空间和global区域查找(也就是查找non-member operator):
至于该operator*是否应该被设为Rational的friend函数,在这里显然是不需要的。别忘了,让越少的代码接触到数据,封装性越高,我们对private部分能做的改动的弹性便越高。
class Rational{ public: Rational( int n = 0, int d = 1 ):num(n), den(d){ } int numerator() const; int denumerator() const; const Rational operator* ( const Rational& lhs, const Rational& rhs ) const;//书上代码觉得有错误,因为member function operator*有两个参数时,表示三元操作符。而书上*应该是表示乘号,只要一个参数就可以了 private: int num; int den; }; Rational oneEighth( 1, 8 ); Rational oneHalf( 1, 2 ); Rational result = oneHalf * oneEighth; //调用oneHalf.operator*( oneEighth ); Rational result2 = oneEighth * oneHalf; //调用oneEighth.operator*( oneHalf ); result = oneHalf * 2; //调用oneHalf.operator*( 2 ); 2隐式转换。 result2 = 2 * oneHalf; //错误,没有函数可调用
从Rational类设计者的角度来看,拿一个Rational对象跟一个整数相乘应该是被允许的,这比较符合我们对它的期望,前面我们也提到,尽量让类的设计与内置类型的行为相一致。若函数设计成non-member函数,将不再受this参数限制,所以参数都可能被隐式转换,当执行时,编译器会首先在该类中查找有没有重载,然后再到命名空间和global区域查找(也就是查找non-member operator):
const Rational operator* ( const Rational& lhs, const Rational& rhs ); result = 2 * oneHalf; //2首先被隐式转换为Rational,成功。
至于该operator*是否应该被设为Rational的friend函数,在这里显然是不需要的。别忘了,让越少的代码接触到数据,封装性越高,我们对private部分能做的改动的弹性便越高。
相关文章推荐
- 条款24:如果所有的参数都需要类型转换,那么请为此采用non-member函数
- [EffectiveC++]item24:若所有参数皆需类型转换,请为此采用non-member函数
- Effective C++ Item 24 若所有参数皆需类型转换,请为此采用non-member函数
- 条款24:若所有参数都需要类型转换,请为此采用non-member函数
- 条款24:若所有参数皆需要类型转换,请为此采用non-member函数(Declare non-member functions when type conversions should apply to all parameters)
- 读书笔记《Effective c++》 条款24 若所有参数皆需要类型转换,请为此采用non-member函数
- 条款24:若所有参数皆需类型转换,请为此采用non-member函数
- 条款24:若所有参数皆需类型转换,请为此采用non-member函数
- 《Effective C++》学习笔记条款24 若所有参数皆需类型转换,请为此采用non-member函数
- 条款24:若所有的函数参数可能都需要发生类型转换才能使用,请采用non-member函数
- Effective C++ -----条款24:若所有参数皆需类型转换,请为此采用non-member函数
- 《Effect C++》学习------条款24 :若所有参数皆须类型转换,请为此采用non-member函数
- 条款24:若所有参数皆需类型转换,请为此采用non-member函数
- Effective C++ 条款24 若所有参数皆需类型转换,请为此采用non-member函数
- 条款24 若所有参数皆需类型转换,请为此采用non-member函数
- effective c++ 若所有参数皆需要类型转换,请为此采用non-member函数
- 条款24 若所有参数皆需类型转换,请为此采用non-member函数
- Effective C++:条款24:若所有参数皆需类型转换,请为此采用non-member函数
- 若所有的参数皆需要类型转换——请为此采用non-member函数
- effective C++ 条款 24:若所有参数皆需类型转换,请为此采用non-member函数