今天偶然的,想到一个蛋疼的问题。在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...........