《Effective C++》条款24

若所有参数皆需类型转换,请为此采用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,禁止了它的隐式类型转换,那么两者都不行。

所以,让它成为一个non-member函数是个不错的选择 。

你可能感兴趣的:(c++)