運算子過載可以使得一些特殊型別參與運算,我是這樣理解的。
//一般形式
class x;
返回型別 operator 運算子(形參表)
{}
所以加減乘除就可以這樣來進行宣告了
返回型別 operator +(-、*、/) (形參表);
如- & ! ++(前),++(後)
等。下面以++(後)
來進行乙個示例:
class code;
code operator++(code& op, int)//第二個引數僅僅表示這個++是字尾加
總結:
運算子過載可以返回任何型別,甚至是void
型別,但是通常都是返回和運算元相同的型別。
下面運算子只能使用成員函式運算子過載,不能使用友元函式來過載。
運算子名稱
=
等號
下標運算子
()
函式呼叫運算子
->
指標成員運算子
對於同乙個運算子,可以寫多個函式來進行過載。
//一般形式
class x
返回型別 x::operator 運算子(參數列)
這裡需要注意的是:參數列中的個數會少乙個,因為左運算元是隱含在this
中的。
但是類內的靜態函式沒有this
指標。
例如:
class code
code operator+(code p)
};code a(1, 2), b(3, 4);
code c=a+b;//這時c.x=4, c.y=6;
形式和上面差不多,這裡不再贅述。
c++
語言只能對已經有的c++
運算子進行過載,不允許使用者自己定義新的運算子。
絕大多數運算子都能過載,但是有例外,下面五個不能進行過載:
名稱.
成員訪問運算子
.*
成員指標訪問運算子
::
作用域運算子
sizeof
長度運算子
?:
條件運算子
過載的功能應當和原有的功能類似
過載不能改變運算子的操作物件
過載不能改變運算子原有的優先順序
過載不能改變運算子原有的結合特性
過載引數應該至少有乙個是類物件,不能都是c++
預定義的型別(要不然就沒有意義了)
雙目運算子一般兩種過載形式都可以,但是有的時候只能用友元形式來進行過載。例如:
ab::operator+(int x)
ob1=ob2+100; //這裡這樣呼叫是可以的,編譯器理解為ob1=ob2.operator(100);
//但是下面的情況就會出現問題
ob1=100+ob2; //等價於ob1=100.operator(ob2);但是100不是乙個物件
如果我們定義下面兩個友元函式就會很好的解決這個問題
friend ab operator+(ab ob, int x);
friend ab operator+(int x, ab ob);
//這樣ob1=100+ob2; ob1=ob2+100;都沒有問題
//這裡我們也可以整合,使用型別轉換函式,將int型別轉換為物件型別,物件型別轉換為int型別,不過真沒啥意思
這裡我們過載=
主要是進行深拷貝操作(當然這裡也可以自己寫乙個拷貝建構函式來進行)。
在過載等號運算子過載時要注意自己等於自己的情況
mystring& mystring::operator=(mystring &s)
只能使用成員函式進行過載,要注意這是個雙目運算子,x[y],x是左操作符,y是右操作符
**
返回型別 類名::operator (參數列)
//有時返回型別可以使用引用型別,只要不是返回的變數不是在函式內宣告的臨時變數就可以
class ab
int& ab::operator(int b)
只能使用成員函式進行過載
注意這裡()
看被作雙目運算子的,x(y), x是左運算元,y是右運算元
//給出座標,返回二維矩陣的某個元素的值.
class matrix
int& matrix::operator()(int r, int c)
m(3, 5)//這裡解釋為m.operator()(3, 5);
()
運算子是唯一乙個可帶多個右運算元的運算子函式
定義原型:需要注意成員函式形式和友元函式形式的區別,他們呼叫方式不相同
//成員函式型別,注意如果使用下面的型別,那麼呼叫的方式是:物件名《對於<<
的引數詳解,《c++ primer中文版:第五版》
\(494\)頁是這樣解釋的:
輸出運算子的第乙個形參是乙個非常量的這裡的基本規則和上面過載輸出運算子差不多,需要多注意的是,輸入過程中要考慮到輸入可能失敗的情況。ostream
物件的引用。之所以ostream
是非常量是因為向流寫入內容會改變其狀態;而該形參是因為我們無法複製乙個ostream
物件。第二個形參一般來說是乙個常量的引用,該常量是我們想要列印的類型別。第二個形參是引用的原因是我們希望避免賦值實參;而之所以該形參可以是常量是因為(通常情況下)列印物件不會改變物件的內容。
為了與其他輸出運算子保持一致,
operator<<
一般要返回它的ostream
形參。
c 運算子過載總結
目錄 1.一般運算子過載 2.關係運算子過載 3.邏輯運算子過載 4.單目運算子過載 5.自增減運算子過載 6.位運算子過載 7.賦值運算子過載 8.記憶體運算子過載 9.特殊運算子過載 10.總結c 的一大特性就是過載 overload 通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔 ...
C 運算子過載總結
c 的一大特性就是過載 overload 通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔 高效。在c 中不止函式可以過載,運算子也可以過載。由於一般資料型別間的運算子沒有過載的必要,所以運算子過載主要是物件導向之間的。1.一般運算子過載 在進行物件之間的運算時,程式會呼叫與運算子相對應的...
C 運算子過載總結
c 的一大特性就是過載 overload 通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔 高效。在c 中不止函式可以過載,運算子也可以過載。由於一般資料型別間的運算子沒有過載的必要,所以運算子過載主要是物件導向之間的。在進行物件之間的運算時,程式會呼叫與運算子相對應的函式進行處理,所以運...