对基本的数据类型,C++提供了许多预定义的运算符,如+,-,*,/,=等,他们可以用一种简洁的方式工作,例如 + 运算符:
int x, y, z;
x = 3;
y = 5;
z = x + y;
这是将两个整数相加的方法,非常简单。
若有一个复数类Complex:
class Complex
{
public:
double real, imag;
Complex(double r = 0, double i = 0)
{
real = r;
imag = i;
}
};
若要把类Complex的两个对象Com1和Com2加在一起,下面语句是不能实现的:
int main
{
Complex Com1(1.1, 2.2), Com2(3.3, 4.4), total;
total = Com1 + Com2; // error
...
return 0;
}
不能实现的原因是类Complex的类型不是基本的数据类型,而是用户自定义的数据类型。所以C++无法直接将两个Complex类的对象相加。
为了表达上的方便,人们希望预定义的运算符可以在特定类的对象上以新的含义进行解释,希望能够实现 total = Com1 + Com2,这就需要通过运算符重载来解决。
C++为运算符重载提供了一种方法,即在进行运算符重载时,必须定义一个运算符重载函数,如下表1.1所示。
函数 | 功能 |
operator+ | 加法 |
operator- | 减法 |
operator* | 乘法 |
operator/ | 除法 |
... | ... |
这样,编译器在遇到一个运算符并且判断运算符两边的数据类型,就可以执行用户自定义的函数了。
因此,若要将上述类Complex的两个对象相加,需要定义一个运算符重载函数operator+(),例如:
Complex operator+(Complex Om1, Complex Om2)
{
Complex temp;
temp.real = Om1.real + Om2.real;
temp.imag = Om1.imag + om2.imag;
return temp;
}
这样我们就能方便的使用语句:
total = Com1 + Com2;
以下就是使用运算符函数 operator+() 将两个Complex类对象相加的完整程序。
#include <iostream>
using namespace std;
class Complex
{
public:
double real;
double imag;
Complex(double r = 0, double i = 0)
{
real = r;
imag = i;
}
friend Complex operator+(Complex Co1, Complex Co2)// 定义运算符+的重载函数
{
Complex temp;
temp.real = Co1.real + Co2.real;
temp.imag = Co1.imag + Co2.imag;
return temp;
}
};
int main()
{
Complex Com1(1.1, 2.2), Com2(3.3, 4.4), total;
total = Com1 + Com2;
cout << "real = " << total.real << " "<< "imag = " << total.imag << endl;
return 0;
}
程序运行结果如下:
C++语言对运算符重载制定了以下一些规则,如表1.2。
1.C++中大部分运算符可以重载除了“.” ".*" "::" "sizeof" "?:" 。 |
2.C++语言只能对已有的运算符重载,不允许用户自定义新的运算符。 |
3.运算符重载一般与原有符号的意义是一致的。 |
4.重载不能改变运算符的操作对象的个数。 |
5.重载不能改变运算符原有的优先级。 |
6.重载不能改变运算符原有的结合特性。 |
7.运算符重载函数的参数至少应有一个是类的对象。 |
8.运算符重载函数可以是普通函数,类的成员函数,类的友元函数。 |
9.用于类的对象的运算符必须重载,但是赋值运算符“=”例外。 |