所谓操作符重载,其实说白了就是一个怪异的函数命名,巧的很的是,这个函数的名字与我们C++内嵌的很多操作符相同。
那,我们什么要进行操作符重载呢?
进行操作符重载的目的,就是为了使我们的程序更具可读性,更具一致性--其实也就是使某些我们自定义的类型能够像C++内嵌的类型拥有一致的运算格式。举个简单的例子:
struct complex // 复数
{
public:
complex(int x, int y)
{
vx = x;
vy = y;
}
public:
int vx;
int vy;
};
如果,我们现在要将两个复数的对象相加,我们就必须要定义一个函数,传入这两个对象,然后,在内部按照复数的运算法相加之后,再返回一个新的对象,这个函数可能是这样的:
complex complex_add(const complex& lhs, const complex& rhs)
{
complex cplx;
cplx.vx = lhs.vx + rhs.vx;
cplx.vy = lhs.vy + rhs.vy;
return cplx;
}
每次进行加法运算的时候,总是要这样:
complex a(5, 6), b(13, 2)
complex sum = complex_add(a, b);
这显然破环了读者对对complex这个美妙的数据类型的良好印象,我们需要的运算应该像这样的:
complex sum = a + b;
那么,此时,我们就需要对复数这个自定义的类型,进行“+”操作符的重载,当然其它的操作符也类似,那么如何实现一个操作符的重载呢?
我们上面已经提及,操作符重载,它的实质也还是函数调用,只不过函数的名字比较特别罢了,为了给操作符重载规定一个特殊的格式,C++使用operator保留字,来修饰重载的函数名(其实就是操作符本身),那么我们刚刚的加法函数就可以写成以下形式:
complex operator+(const complex lhs, const complex& rhs);
就是如此的简单,乃至函数体中的任何东西都不需要改变,所以,我再罗嗦一句,所谓操作符重载,也就是将我们自定义的函数,改头换面成一个让大家,尤其是让你自己觉得比较顺眼的函数而已。
当然,操作符重载,还有很多其他特性,如果您有什么不明白的地方,不妨说出来,我们一同讨论可以。