今天偶然的,想到一个蛋疼的问题。在c++里面,我们有可爱的运算符重载。然后运算符重载也有2种,一个是成员运算符,一个是非成员运算符。。。。。。。。。到底我们该选择哪个呢?各自又有怎样的优缺点呢。。。。。。。于是我进行了研究;首先,我查找了网上。网上广泛流传着林锐的书中的建议。。。但是呢,至于什么原因,网上从来没有说明过~于是,我追本溯源。。。。终于让我研究出来了0 0,分享出来一下。。。

首先,我们看,我们的运算符,各种各样可以重载的运算符,我们先看1元的。。。林锐书上说的是1元运算符尽量重载成成员函数,为什么呢,我们先看一段例子。。。

Vec& operator-(const Vec&)

class name

{

};

class Vec

{

Vec(const Name&, int i = 0);

};

int main()

{

name n;

Vec d = -n;

}

我们果断地看到,编译已经过去。。。但是。。。我们的原意显然不是这样。。这个隐式转换不是我们需要的。。。所以呢,我们应该这样设计Vec类

class Vec

{

Vec(const Name&, int i = 0);

Vec& operator-()const;

};

然后。。。编译期间就已经阻止了这种危险的行为;

所以,同理,一元运算符因该被重载于成员,但是随后群里一犀利哥随后指出,Vec d = n-;还是有问题。。。不过一般没人这么蛋疼。。。54一。一;

然后我们看2元运算符,很抱歉,我忽略了很多运算符的描述,比如必须成员的,比如不能重载的。。。我们来看一些二元运算符,我们先看一个,+=这个聚合起来的运算符(=必须使成员运算符),,我们看,假设有:

Complex c;

c += 5;

这个时候,如果他是全局运算符的话。。。。且Complex支持隐式转换,这个时候就会让左边的操作数被隐式转换,以至于结果混乱,为了不产生这种副作用,这一系列请重载成成员函数,

然后我们看最后那种,+之类的运算符。。。

假设有代码:

class Complex

{

public:

Complex(double = 0.0, double = 0.0);

Complex& operator+(const Complex&)const;

};

int main()

{

Complex c(1.0);

Complex d = c + 10.0;

Complex e = 1.0 + c;

}

这时候e那句会出错。。。所以这次全局的比较给力。。。。应该定义成全局的运算符;

what the fucking implicitly converted...........