条款24:若所有参数皆需类型转换,请为此采用non-member函数
看下面这段代码
class num{ public: int data; num(int a):data(a){} num():data(0){} const num operator*(num a)const{ num res; res.data = this->data*a.data; return res; } };
当我们这样调用操作符的时候
num b = a*2;
编译是正确的,因为存在构造函数,所以2被解释成num(2);
但是如果我们这么写
num b = 2*a;
将不会通过编译,因为2不被认为是num对象,不能调用*(num a)的操作符
对此的解决办法就是,将这个操作符设到类外
class num{ public: int data; num(int a):data(a){} num():data(0){} }; const num operator*(num a,num b){ num res; res.data = b.data*a.data; return res; }
也就是说如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。