這是c++的特色,也是c++比較難的乙個基本語法,但是,如果你把運算子過載看成乙個特殊的類方法,且這個類方法的名稱就是運算子,一切就變得簡單了。
下面用乙個簡單的程式說明這個問題:
宣告兩個3x3二維矩陣a,b,其實就是matrix類,裡面就用私有的長度為9的一維陣列儲存資料。只是列印的時候,打成二維陣列的樣子
實現~a或者~b就能直接列印a與b,也就是~相當於把a,b列印出來,此乃單目運算子過載。
實現a+b,返回另乙個相加之後的矩陣c。
也就是說做到如下圖的效果:
**如下:
[cpp]view plain
copy
print?
#include
using
namespace
std;
class
matrix
} matrix(int
m11,
intm12,
intm13,
intm21,
intm22,
intm23,
intm31,
intm32,
intm33)
void
operator ~ ()
cout
;//這裡沒有標明主人的matrix代表參與運算的matrix類的私有成員matrix。不是我偷懶不寫this->,是本來不能有this->。下同
} cout
matrix operator + (matrix &b)
return
c;
} };
intmain()
看完**,運算子過載的作用很顯然了,如果要宣告乙個類列印方法,按照各大物件導向的程式語言,基本上都要為這個類開乙個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 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...