类对象的四则运算
上一小节了解了运算符重载的意义与作用,接下来我们就来学习一下如何进行运算符重载。已知有类A,其定义代码如下所示:
class A
{
private:
int m;
int n;
public:
A(int x = 0, int y = 0):m(x), n(y){}
void show() const; //输出数据
};
根据上述代码,创建两个对象a1和a2,如果让两个对象直接进行四则运算显然是不行的,因为在C++中,运算符的操作对象只能是基本数据类型,那么如果要实现“a1+a2”这样的四则运算,我们就需要在类中定义实现加法运算的函数。
首先要在类中定义一个实现加法运算的函数,例如int add(const A& a);然后定义该函数要实现的功能,例如这个函数只实现两个对象中成员变量m相加,代码如下所示:
class A
{
private:
int m;
int n;
public:
A(int x = 0, int y = 0):m(x), n(y){}
void show() const; //输出数据
int add(const A& a){return m + a.m; } //实现加法的函数
};
在类中定义了add()函数之后,就可以调用该函数实现两个对象的加法运算,如下代码所示:
a1.add(a2);
这样就实现了两个对象的加法运算,但有一点,这样看起来并不直观,而且如果要实现多种运算,如减法、乘法、大于、小于等,这样定义多个函数,函数名各种各样,那么使用起来很不方便。
针对上述情况,我们可以考虑用运算符作为函数名,例如上述类A中定义的加法函数add(),我们可以直接用“+”运算符来作为函数名,这样就能很直观的看出是加法运算。这就是C++提供的运算符重载机制,重载运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要重载的运算符共同组成。和其他函数一样,重载运算符的函数也包括返回类型、参数列表及函数体,其语法格式如下所示:
返回类型 operator 运算符(参数列表)
{
函数体;
}
在上述语法格式中,operator是运算符重载的关键字,运算符就是要重载的运算符的名称(如+、-、*、/等),但必须是C++允许重载的运算符。接下来我们就以重载类A的“+”、“-”运算符为例来讲解如何进行运算符重载,具体代码如例1所示。
例1
1 #include <iostream>
2 using namespace std;
3 class A
4 {
5 private:
6 int x;
7 int y;
8 public:
9 A(int x1 = 0, int y1 = 0):x(x1), y(y1){}
10 void show() const; //输出数据
11 A operator+(const A& a) const; //重载+运算符
12 A operator- (const A& a) const; //重载-运算符
13 };
14 //类成员函数的实现
15 void A::show() const //show()函数的实现
16 {
17 cout << "(x,y) = " << "(" << x << "," << y << ")" << endl;
18 }
19
20 A A::operator+(const A& a) const //重载+运算符的实现
21 {
22 return A(x + a.x, y + a.y);
23 }
24
25 A A::operator-(const A& a) const //重载-运算符的实现
26 {
27 return A(x - a.x, y - a.y);
28 }
29 //main()函数调用
30 int main()
31 {
32 A a1(1, 2);
33 A a2(4, 5);
34 A a;
35 cout << "a1: ";
36 a1.show();
37 cout << "a2: ";
38 a2.show();
39 a = a1 + a2; //实现两个对象相加
40 cout << "a: ";
41 a.show();
42 a = a1 - a2; //实现两个对象相减
43 cout << "a: ";
44 a.show();
45 system("pause");
46 return 0;
47 }
运行结果如图1所示。
图1 例1运行结果
从图1可以看出,“+”、“-”运算符重载成功,可以在两个对象间直接进行加减运算,其实除了函数名称中的operator关键字外,运算符重载函数与普通函数没什么区别,在使用的时候调用运算符实质上就是调用函数名。读者可据此自己实现“*”、“/”运算符的重载。
通过上面讲解可以知道,重载运算符并没有改变其原来的功能,只是增加了针对自定义数据类型的运算功能,具有了更广泛的多态特征。