这是C++的特色,也是C++比较难的一个基本语法,但是,如果你把运算符重载看成一个特殊的类方法,且这个类方法的名称就是运算符,一切就变得简单了。
下面用一个简单的程序说明这个问题:
声明两个3x3二维矩阵a,b,其实就是Matrix类,里面就用私有的长度为9的一维数组存储数据。只是打印的时候,打成二维数组的样子
实现~a或者~b就能直接打印a与b,也就是~相当于把a,b打印出来,此乃单目运算符重载。
实现a+b,返回另一个相加之后的矩阵c。
也就是说做到如下图的效果:
代码如下:
#include <iostream> using namespace std; class Matrix{ private: int matrix[9];//用一个长度为9的一维数组存储3x3的矩阵 public: Matrix(){//这里为Matrix类写两个不同参数的构造方法,主要是为了编程方便。 for(int i=0;i<9;i++){ this->matrix[i]=0; } } Matrix(int m11,int m12,int m13,int m21,int m22,int m23,int m31,int m32,int m33){//这个构造方法写得很明显了,传来9个数,分别赋予给矩阵的11位置,12位置…… this->matrix[0]=m11;this->matrix[1]=m12;this->matrix[2]=m13; this->matrix[3]=m21;this->matrix[4]=m22;this->matrix[5]=m33; this->matrix[6]=m31;this->matrix[7]=m32;this->matrix[8]=m33; } void operator ~ (){//对单目运算符~的重载,这里严格要求,不能有形式参数。 for(int i=0;i<9;i++){ if(i%3==0){ cout<<endl; } cout<<matrix[i]<<" ";//这里没有标明主人的matrix代表参与运算的Matrix类的私有成员matrix。不是我偷懒不写this->,是本来不能有this->。下同 } cout<<endl; } Matrix operator + (Matrix &b){//对双目运算符+的重载,这里严格要求形式参数仅能为一个。代表运算符后面的Matrix类。 Matrix c; for(int i=0;i<9;i++){ c.matrix[i]=matrix[i]+b.matrix[i];//这里没有标明主人的matrix代表运算符前者的Matrix类的私有成员matrix } return c; } }; int main(){ Matrix a(1,2,3,4,5,6,7,8,9); Matrix b(9,8,7,6,5,4,3,2,1); cout<<"矩阵a如下:"; ~a; cout<<"矩阵b如下:"; ~b; cout<<"矩阵a、b相加之后如下:"; ~(a+b); return 0; }
看完代码,运算符重载的作用很显然了,如果要声明一个类打印方法,按照各大面向对象的编程语言,基本上都要为这个类开一个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语言的规则,不为什么。运算符重载一开始就是用于自定义类直接的运算。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-18 03:10:57