若所有参数皆需类型转换,请为此采用non-member函数
如果想实现这样的一种运算符重载:
class A { public:A(int x) :_x(x) {};const A operator*(const A& a){A ret(0);ret._x = a._x * a._x;return ret;} private:int _x; };
A a(1); A b(2); A ret = a * b;
很明显可以这样用,其实也可以这样:
ret = a * 3;
这里发生了隐式类型转换,把3转成了A对象。
但是这样写就不行:
ret = 3 * a;
实际上是这样的:
ret = a.operator*(3); // 正确 ret = 2.operator*(A); // 错误
结论是:只有当参数被列于参数类内,这个参数才是隐式类型转换的合格参与者。所以this,绝对不是。
而且如果把构造函数加上explicit,禁止了它的隐式类型转换,那么两者都不行。