c++學習筆記之運算符重載


1、重載運算符

void operator+(....)        //重載"+"運算符
(1)如果是成員函數形式,那麼必須是非static
(2)使用運算符必須重載,除了“=”、“&”、“,”這三個可直接使用,也可以重載。
(3)不能重載的運算符“.”、“.*”、“::”、“?:”
(4)重載不能改變運算符的優先級,不能改變結合律,不能改變運算符“元數”(操作數)
(5)不能創建新運算符
(6)不能改變運算符對基本類型對象操作的含義。重載只能對用戶自定義類型對象或基本類型和用戶自定義類型混合使用

2、相關運算符

如重載加法運算符 obj2 = obj2 + obj1
但是obj2 += obj1不成立,必須重載“+=”運算符才行。

3、成員函數和全局函數

(1)“()”、“[]”、“->”或任何賦值運算符重載,必須聲明爲類成員函數。其他運算符則都可以
(2)如果是成員函數,那麼左邊操作數(或唯一操作數)必須是該類的對象。否則用全局函數重載,如重載流操作“<<”。
(3)使用全局函數可以使重載的運算符有可交換性,即左右操作數可以交換。
(4)一元運算符可以重載爲一個不帶參數的非static成員函數或帶一個參數的全局函數(全局函數的參數必須是該類的對象或引用)
(5)二元運算符可以重載爲帶一個參數的非static成員函數或帶兩個參數的全局函數(其中一個參數必須是該類的對象或引用

4、自我賦值

如果出現自我賦值,而operator=未檢測,那麼函數會在賦值操作前刪除動態內存,使指針指向已釋放的內存卡,導致運行錯誤

5、類型轉換

c++基本類型可以互相轉換,用戶自定義類和基本類型或用戶自定義類之間則不能。
轉換運算符又稱強制類型轉換運算符:
classA::operator classB() const;
當編譯器遇到static_cast<classB>(a)時(a是classA一個對象),會調用上面函數進行轉換。
(1)轉換構造函數:任何單一參數的構造函數都可以看成是轉換構造函數
(2)轉換運算符和轉換構造函數有點事編譯器可以隱式調用
(3)在重載運算符函數中,這種自定義的類型轉換隻能隱式調用一級

6、重載自增自減(++、--)

前置 class &operator++();
後置 class operator++(int);
後置函數中int參數爲0,是一個啞值,僅爲了區分前置和後置。
後置自增自減會產生臨時對象,所以儘量使用前置自增自減

7、禁止隱式轉換

左右單參數構造函數都可以用做隱式類型轉換。
但是如果有些這類構造函數不像被當成隱式轉換構造函數,需要聲明成explicit即可。
explicit只能用於聲明單參數構造函數,聲明其他構造函數或成員函數會編譯錯誤
發佈了106 篇原創文章 · 獲贊 30 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章