運算子過載本質上是函式過載。operator與運算子名稱在一起構成了新的函式名。比如
const complex operator+(const complex &c1,const complex &c2);,我們會說,operator+ 過載了運算子 +。
語法格式:
返值型別 operator 運算子名稱(形參表列)
過載實體;
1. 運算子既可以被過載為友元函式,也可以被過載為成員函式。若同時過載則呼叫時會產生歧義。
通常情況下,雙目運算子(以 + 為例),過載為成員需要乙個引數,過載為友元需要兩個引數;單目運算子,過載為成員需要0個引數,過載為友元需要乙個引數。
2. 過載規則
3. 運算子過載總結
4. 友元還是成員
乙個操作符的左右運算元不一定是相同型別的物件,這就涉及到將該操作符函式定義為誰的友元,誰的成員問題。
乙個操作符函式,被宣告為哪個類的成員,取決於該函式的呼叫物件(通常是左運算元)。通常左運算元的成員,右運算元的友元。
5. 型別轉換
5.1 用型別轉換建構函式進行型別轉換
在目標類中宣告,實現其它型別到本型別的轉換。
轉換建構函式,本質是乙個建構函式,是只有乙個引數的建構函式。如有多個引數,只能稱為建構函式,而不是轉換函式。
轉換建構函式格式:
class 目標類
目標類(const 源類 & 源類物件引用)
把單引數構造器稱為型別轉換構造器,可應用於賦值、傳參、初始化、返回值等。
explicit 關鍵字限定的型別轉換建構函式,必須是顯式地使用 static_cast《目標類》 (源類物件) 進行轉換,防止隱式轉換。
5.2 用型別轉換操作符函式進行轉換
class 源類
在源類中宣告。轉換函式必須是類方法,轉換函式無引數,無返回,但有 return語句。
point2d::operator point3d()
return point3d(_x,_y,0);
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...