Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300150
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: C/C++

2013-01-08 11:36:08

不要讲将所有参数都(可能)需要(隐式)转换的函数(重点应该是重载的四则运算符)声明为成员,即将他们在类外。

以重载的乘法运算符为例,先将其声明在类内,因为有绑定的this指针,所以只带一个参数rhs。

点击(此处)折叠或打开

  1. class Rational {
  2. public:
  3.   Rational(int numerator = 0, // ctor is deliberately not expl
  4.            int denominator = 1); // allows implicit int-to-Ration

  5.  const Rational operator*(const Rational& rhs) const;

  6. private:
  7.   ...
  8. };
注意其构造函数没有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指针位置),不会进行转换,所以失败了。

所以通常将所有参数都(可能)需要(隐式)转换的函数/运算符声明在类外,必要时声明为友元,偏于访问内部数据成员。
阅读(382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~