学科分类
目录
C++基础

类对象的四则运算

上一小节了解了运算符重载的意义与作用,接下来我们就来学习一下如何进行运算符重载。已知有类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关键字外,运算符重载函数与普通函数没什么区别,在使用的时候调用运算符实质上就是调用函数名。读者可据此自己实现“*”、“/”运算符的重载。

通过上面讲解可以知道,重载运算符并没有改变其原来的功能,只是增加了针对自定义数据类型的运算功能,具有了更广泛的多态特征。

点击此处
隐藏目录