C++中的重载技术不仅应用于函数,还可以应用于运算符,运算符重载意味着赋予已有的运算符多种含义,但是同一运算符的含义必须相符,即加法运算符不能重载用于减法运算,等等。
几乎所有的运算符都可以实现重载,包含算术运算符,位操作运算符,逻辑运算符,比较运算符,赋值运算符等。要记住这些运算符不太容易,我们可以记住不能重载的运算符有“.”,“.*”,“::”和“?:”。
运算符重载并不会改变原运算符的优先级和结合性。
在对运算符重载的方式上,可以利用成员函数重载,也可以使用友元方式重载。
假定我们定义了一个Animal类,并要输出对象的信息,我们可以以友元的方式在类中定义一个输出函数,定义如下:
friend ostream & operator <<(ostream & os, Animal & a);
上述语句通过友元方式重载流运算符,函数中第一个参数是输出流的一个引用,第二个参数是要输出对象的引用,函数返回输出流的引用,正因为输出的是输出流的引用,从而可以实现cout<<a<<b<<c<<endl;的连续输出效果。
如果将函数改为:
friend out operator <<(ostream & os, Animal & a);
则无法实现几个对象的连续输出。
不但流运算符可以重载,其他运算符也可以进行重载,取最简单的“+”加法运算符为例。加法运算符可以实现很多内置数据类型的加法运算,如果我们定义了一个类,比如说Animal类,需要实现对类的对象进行相加,那么我们就需要在类内部实现“+”运算符的重载,实现类内部数据成员的相加。