C 運算子過載

2021-06-06 16:53:00 字數 1082 閱讀 4077

運算子是通過編寫非靜態成員函式定義的或全域性函式定義進行過載的,只是函式名現在變成了關鍵字opetator,後面跟隨的是被過載的運算子的符號。當運算子被過載為成員函式時,它們必須是非靜態的,因為它們必須在這個類的物件上被呼叫,並操作這個物件。

為了在類的物件上使用運算子,這個運算子必須被過載,但有三種情況例外。賦值運算子(=)、取址運算子(&)、逗號運算子(,)。可以再補充在的情況下直接用於任何類的物件,賦值運算子可用於每個類,執行類的資料成員的逐成員賦值,即每個資料成員從源物件複製給目標物件。這種預設的逐成員賦值對於帶指標成員的類是危險的。對於這樣的類,將顯示地過載賦值運算子。取址運算子(&)返回物件在記憶體中的位址。逗號運算子對左邊的表示式求值,然後對右邊的變大時求值,也可以過載這兩個運算子。

過載運算子不改變運算子的優先順序,運算子的結合性也不能通過過載改變,也不能改變運算子所帶的運算元的數量。

當運算子用於基礎型別時:運算子作用於基礎型別的物件時所表達的意思,不會因為運算子過載而改變。運算子過載只適用於使用者定義型別的物件,或者使用者定義型別的物件與基礎型別的物件混合用的情況。

類的成員運算子和全域性運算子的比較:

當運算子被函式實現為成員函式時,它的左運算元(or 唯一運算元)必須是這個運算子所在類的物件(或物件的引用)。如果做運算元必須是其他類或基礎型別的物件,則這個運算子函式必須作為全域性函式實現。如果全域性函式必須直接訪問類的私有成員或保護成員,則可以將它宣告為這個類的友元。

必須過載為成員函式的運算子:

當過載()、[ ]、->或任何賦值運算子時,必須將運算子過載函式宣告成類的成員函式。對於其他運算子,運算子過載函式可以使類的成員函式或全域性函式。

流插入和流提取運算子要被過載為全域性函式:

過載的流插入運算子(<<)用於做運算元為ostream&(輸出流)型別的表示式中,example:cout<>)用於做運算元為istream&型別的表示式,examplecin>>classobject,當它的右運算元是使用者定義型別的物件時,這個運算子也必須被過載為全域性函式。而且,這個兩個過載運算子函式都可能需要訪問被輸出或輸入的類物件的私有資料成員,因此處於效能考慮,他們可以被宣告為這個類的友元函式。

C 運算子過載 過載特殊運算子

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...