c 運算子過載

2021-07-05 02:29:16 字數 1170 閱讀 7708

成員函式&友元函式

運算子過載有兩種形式,一種是類的成員函式,一種是類的友元函式。成員函式傳遞的是乙個引數,例如c3=c1+c2,實際上等於c3=c1.operator+(c2),這裡隱含乙個this指標,只有c2作為引數傳遞。如果過載為友元函式,c3=c1+c2,實際上等於c3=operator+(c1,c2),沒有this指標,c1和c2都作為引數傳遞。

如果c1是本類的物件或者引用,一般可以寫成成員函式版本。但是成員函式版本和友元函式版本還是有區別的,成員函式版本無法對第乙個引數做自動型別轉換操作。

友元函式一般是全域性函式。對於c3=1+c2,因為左操作不是我們定義的型別,對於成員函式版本的過載,編譯器就不知道怎麼做了。這個時候需要使用友元函式版本,編譯器會自動將1轉換為需要的型別。那麼問題來了,對於1+1這樣的情況怎麼辦?編譯器首先匹配「最簡單」可能性,對於1-1將優先使用內建運算子,而不是將兩個1都轉換為相應的型別,然後呼叫operator+。

過載的規則

(1)只能過載c++已有的運算子,而且除了少數幾個外都能過載。

(2)過載之後運算子的優先順序和結合性都不變。

(3)過載的功能應當與原功能相類似,不能改變原運算子操作物件個數,至少要有乙個操作物件是自定義型別。

(4)運算子過載中所有賦值運算子都需要檢查自賦值,這是總原則。某些情況下不需要,例如operator+=。

引數和返回值

(1)對於任何函式引數,如果僅需要從引數中讀而不改變它,預設地應當作為const引用來傳遞它。

(2)返回值得型別取決於運算子的具體含義。如果是產生乙個新值,就需要產生乙個作為返回值得新物件。

(3)所有賦值運算子均改變左值。為了是賦值結果能用於鏈式表示式(a=b=c),應該能夠返回乙個剛剛改變了的左值的非常量引用。

(4)對於邏輯運算子,至少得到乙個int返回值,最好是bool返回值。

過載賦值符

在過載「=」時需要注意,一方面它會引發建構函式的呼叫,更需要注意的是類的成員變數含有指標物件的情況,這種情況下常有兩種解決方式:

(1)在過載operator=函式體中直接new新的物件,當然要想好記憶體的**。

(2)如果指標所指向的物件比較大,而且也沒有必要new,那麼可以在指標指向的物件中增加乙個int型成員變數,作為引用計數。

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

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

C 運算子過載賦值運算子

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

C 運算子過載轉換運算子

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