【C++】运算符重载

来源:互联网 发布:螺旋箍筋的算法 编辑:程序博客网 时间:2024/05/22 13:15

这是C++的特色,也是C++比较难的一个基本语法,但是,如果你把运算符重载看成一个特殊的类方法,且这个类方法的名称就是运算符,一切就变得简单了。

下面用一个简单的程序说明这个问题:

声明两个3x3二维矩阵a,b,其实就是Matrix类,里面就用私有的长度为9的一维数组存储数据。只是打印的时候,打成二维数组的样子

实现~a或者~b就能直接打印a与b,也就是~相当于把a,b打印出来,此乃单目运算符重载。

实现a+b,返回另一个相加之后的矩阵c。

也就是说做到如下图的效果:


代码如下:

[cpp] view plain copy
 print?
  1. #include <iostream>  
  2. using namespace std;  
  3. class Matrix{  
  4. private:  
  5.     int matrix[9];//用一个长度为9的一维数组存储3x3的矩阵  
  6. public:  
  7.     Matrix(){//这里为Matrix类写两个不同参数的构造方法,主要是为了编程方便。  
  8.         for(int i=0;i<9;i++){  
  9.             this->matrix[i]=0;  
  10.         }  
  11.     }  
  12.     Matrix(int m11,int m12,int m13,int m21,int m22,int m23,int m31,int m32,int m33){//这个构造方法写得很明显了,传来9个数,分别赋予给矩阵的11位置,12位置……  
  13.         this->matrix[0]=m11;this->matrix[1]=m12;this->matrix[2]=m13;  
  14.         this->matrix[3]=m21;this->matrix[4]=m22;this->matrix[5]=m33;  
  15.         this->matrix[6]=m31;this->matrix[7]=m32;this->matrix[8]=m33;  
  16.     }  
  17.     void operator ~ (){//对单目运算符~的重载,这里严格要求,不能有形式参数。  
  18.         for(int i=0;i<9;i++){  
  19.             if(i%3==0){  
  20.                 cout<<endl;  
  21.             }  
  22.             cout<<matrix[i]<<" ";//这里没有标明主人的matrix代表参与运算的Matrix类的私有成员matrix。不是我偷懒不写this->,是本来不能有this->。下同  
  23.         }  
  24.         cout<<endl;  
  25.     }  
  26.     Matrix operator + (Matrix &b){//对双目运算符+的重载,这里严格要求形式参数仅能为一个。代表运算符后面的Matrix类。  
  27.         Matrix c;  
  28.         for(int i=0;i<9;i++){  
  29.             c.matrix[i]=matrix[i]+b.matrix[i];//这里没有标明主人的matrix代表运算符前者的Matrix类的私有成员matrix  
  30.         }  
  31.         return c;  
  32.     }  
  33. };  
  34.   
  35. int main(){  
  36.     Matrix a(1,2,3,4,5,6,7,8,9);  
  37.     Matrix b(9,8,7,6,5,4,3,2,1);  
  38.     cout<<"矩阵a如下:";  
  39.     ~a;  
  40.     cout<<"矩阵b如下:";  
  41.     ~b;  
  42.     cout<<"矩阵a、b相加之后如下:";  
  43.     ~(a+b);  
  44.     return 0;  
  45. }  

看完代码,运算符重载的作用很显然了,如果要声明一个类打印方法,按照各大面向对象的编程语言,基本上都要为这个类开一个void xx()的打印方法,然后这个xx的打印方法,就把类的私有成员this->aa,this->bb通通打印出来,在主函数调用的话,要a.xx()这样调用才能调用。

把~重载之后,可以直接对Matrix这个类进行打印。相当于在Matrix这个类中,声明一个叫~的打印方法,把原来C/C++中位取反的运算符重载了。

之后对+的重载,主要是两个Matrix类中私用成员进行运算。相当于在Matrix这个类中声明一个类似addMatrix(Matrix &b)的方法,里面实现this->matrix[i]与b.matrix[i]的相加,之后在主函数Matrix c=a.addMatrix(b)的意思了。

最后值得注意的一点:运算符重载仅能用于类里的私有成员之间的运算,不能用于C语言的标准类型直接的运行。比如,我想把^重载成两个int之间的幂运算,是绝对不可以的。这是c语言的规则,不为什么。运算符重载一开始就是用于自定义类直接的运算。

原创粉丝点击