不要讲将所有参数都(可能)需要(隐式)转换的函数(重点应该是重载的四则运算符)声明为成员,即将他们在类外。
以重载的乘法运算符为例,先将其声明在类内,因为有绑定的this指针,所以只带一个参数rhs。
- class Rational {
- public:
- Rational(int numerator = 0, // ctor is deliberately not expl
- int denominator = 1); // allows implicit int-to-Ration
- const Rational operator*(const Rational& rhs) const;
- private:
- ...
- };
注意其构造函数没有explicit关键字,所以是可以进行隐式转换的。
Rational oneEighth(1, 8);
Rational oneHalf(1, 2);
Rational result = oneHalf * oneEighth; // fine
result = result * oneEighth; // fine
result = oneHalf * 2; // fine
上面的都没问题,下面这个就不行了
result = 2 * oneHalf; // error!
完整的调用形式:
result = oneHalf.operator*(2); // fine
result = 2.operator*(oneHalf); // error!
第一个由于参数2处于参数列表(parameter list),构造函数又没有explicit关键字,编译器对其进行了隐式转换,相当于 Rational(2,1)这么一个对象传入了*运算符内。
而第二个参数2处于调用者位置(绑定this指针位置),不会进行转换,所以失败了。
所以通常将所有参数都(可能)需要(隐式)转换的函数/运算符声明在类外,必要时声明为友元,偏于访问内部数据成员。
阅读(374) | 评论(0) | 转发(0) |