運算子過載,就是對已有的運算子(c++中預定義的運算子)賦予多重的含義,使同一運算子作用於不同型別的資料時導致不同型別的行為。
運算子過載的目的是:擴充套件c++中提供的運算子的適用範圍,使之能作用於物件。
同乙個運算子,對不同型別的運算元,所發生的行為不同。
1.運算子過載的實質是函式過載。
2.可以過載為普通函式,也可以過載為成員函式。
3.把含運算子的表示式轉換成對運算子函式的呼叫。
4.把運算子的運算元轉換成運算子函式的引數。
5.運算子被多次過載時,根據實參型別決定呼叫哪個運算子函式。
返回值型別 operator 運算子(形參表)
注意:過載為成員函式是,引數個函式為運算子目數減一。
過載為普通函式時,引數個數為運算子目數。
一般情況下,將運算子過載為類的成員函式,是較好的選擇。
但有時,過載為成員函式不能滿足使用要求,過載為普通函式,又不能訪問類的私有成員,所以需要將運算子過載為友元。
如加號的過載,使用時必須要保證物件在符號左側,這顯然與原有的符號有一定不同。
因此我們可以把+過載為普通函式。同時將其設為要訪問成員的友元。
有時候我們希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個char *型別字串賦值給乙個字串物件,此時就需要過載賦值運算子「=「。
賦值運算子「=」只能過載為成員函式。 為什麼有的操作符過載函式只能是成員函式?
注意:初始化時呼叫的是複製建構函式,而不是運算子「=」:
string s="hello" //呼叫複製建構函式。淺拷貝只是單純的把兩個物件的內容一致,並不能保證兩個物件的成員指向的不同的位址,如果物件中的成員是位址,那麼很容易造成兩個物件的成員指向同乙個位址。這種賦值我們稱為淺拷貝,淺拷貝往往是不安全的。string s1("hello") //呼叫複製建構函式。
s="world" //呼叫運算子「=」。
深拷貝保證兩個物件的位址指向的內容一致,而不是物件的位址一致。
物件預設的賦值運算子一般執行淺拷貝,所以一般情況下我們要自己過載賦值建構函式。(物件的複製建構函式也是如此)
關於淺拷貝深拷貝以及過載賦值運算子需要注意的問題詳見:=運算子過載應注意點
關於賦值運算子過載的返回值型別:
對運算子進行過載的是後,好的風格是應該盡量保留運算子原本的特性
為了支援這一特性並且支援a=b=c和(a=b)=c我們應該使用賦值左邊的物件的引用作為返回型別。
iostream中過載了《與》運算子,其中有istream物件與ostream物件。
為了能支援連續運算,流運算子需要返回相應引用。
過載《與》運算子只能使用普通函式,因為iostrem物件已經在標頭檔案中完成,無法再為它新增新的成員。
任何型別的名字都是乙個型別轉換運算子(自定義型別?),其返回值都是本身的型別,比如double型別轉換運算子的返回型別就是double本身。
如:
operator double()自增運算子++、自減運算子--有前置/後置之分,為了區分所過載的是前置運算子還是後置運算子,c++規定:
前置運算子作為一元運算子過載,後置運算子為二元運算子除了型別本身還有乙個int。
後置自增自減運算子返回型別為該物件改變前的實體。
前置返回的是物件改變後的引用。
一般來說前置運算子比後置運算子要快很多,因為後置運算子需要返回實體開銷較大。
1.c++不允許定義新的運算子;
2.過載後運算子的含義應該符合日常習慣;
3.運算子過載不改變運算子的優先順序;
4.以下運算子不能過載:"."、".*"、"::"、"?:"、sizeof;
5.過載運算子()、、->或者賦值運算子,運算子過載函式必須宣告為類的成員函式。
運算子過載筆記
建立臨時物件 將自加後的物件賦給另乙個物件,我們需要建立乙個臨時物件,然後返回該物件 include using namespace std class num num int get const void set int x num operator private int n int main ...
運算子過載筆記
1.不能用友元過載的運算子 原因有2種說法 1 operator 時可以將友元函式宣告和類分開放,那麼在這個operator 函式之前的 遇到 號就是預設的 操作符,在operator 之後的 用的就是這個過載的operator 造成了混亂.2 作為成員函式過載時,呼叫物件就是第乙個引數,比如 作為...
C 學習筆記四 運算子過載
當呼叫乙個過載函式和過載運算子時,編譯器通過把您所使用的引數型別和定義中的引數型別相比較,巨鼎選用最合適的定義。過載決策 過載運算子時帶有特殊名稱的函式,函式名是由關鍵字operator和其後要過載的運算子符號構成,與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。返回型別 operator ...