標籤:c++ 運算子多載 c 類 重載
這是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語言的規則,不為什麼。運算子多載一開始就是用於自訂類直接的運算。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【C++】運算子多載