第四章 運算子過載

2022-07-13 15:48:14 字數 2061 閱讀 9043

目錄定義:重新定義運算子的運算

實質是函式過載,把含有運算子的表示式轉換成對運算子函式的呼叫

可以過載為普通函式、成員函式、友元函式

多次過載時,根據實參型別決定呼叫哪個運算子函式

等號只能過載為成員函式

賦值語句和初始化語句的等號=含義不同,初始化語句需要用建構函式實現

同類賦值注意點(可能包含指標)

深拷貝:釋放原有記憶體空間,並重新動態分配一塊記憶體

在拷貝前應檢查是否拷貝自身(即if(this=&s),會造成自身內部空間先被delete,導致複製出錯),是則直接return *this

返回值應為classname&voidclassname有缺陷[1]

a=b=c; //連續賦值,void不行

(a=b)=c; //結果為a=c; classname不行

使用複製拷貝函式時,需要考慮類似的問題

string& string::operator= (const string &s)else

return *this;

}

非引用的函式返回值不能作為左值使用[2]

賦值和初始化時採用深拷貝

coutcin分別是ostreamistream類的物件,類中分別對<<>>運算子進行了過載

可全域性過載>><<運算子,使其滿足要求

ostream& operator << (ostream &os,const complex &c)

不寫返回值(返回值即轉換型別)

定義為成員函式時,無引數[3]

class complex;

operator double () //將complex類強制轉換成double類

};

包含了顯式型別轉換和自動型別轉換

complex c(1.2,3.4);

cout<<(double) c<

前置(作為一元運算子處理),返回值為引用

//成員函式

t& operator++();

t& operator--();

//普通函式

t& operator++(t& c);

t& operator--(t& c);

後置(作為二元運算子處理),返回值不是引用,效率沒前置的高

//成員函式

t operator++(int);

t operator--(int);

//普通函式

t operator++(t& t,int);

t operator--(t& t,int);

示例

cdemo& operator--(cdemo &c)

cdemo operator--(cdemo &c,int)

c++不允許定義新運算子

過載後運算子應符合日常習慣

運算子過載不改變運算子優先順序

不能被過載的運算子:.,.*,::,?:,sizeof

過載運算子(),,->,或賦值運算子=時,運算子過載函式必須宣告為類成員函式

運算子過載時,應盡量保留運算子原有的特性 ↩︎

不能被賦值 ↩︎

成員函式引數個數=運算元-1 ↩︎

第四章 運算子的本質

陣列是存在於人們頭腦中的乙個邏輯概念,而編譯器其實並不知道有陣列這個東西,它所知道的,只是運算子,當遇到運算子的時候,編譯器只是簡單地把它轉換為類似 a i j 這樣的等價表示式,之所以是這種表示式,如前幾章所述,是因為c語言的陣列實現本質上是陣列的巢狀。由於這種等價關係的存在,會產生一些古零精怪的...

第四章 運算子的本質

陣列是存在於人們頭腦中的乙個邏輯概念,而編譯器其實並不知道有陣列這個東西,它所知道的,只是運算子,當遇到運算子的時候,編譯器只是簡單地把它轉換為類似 a i j 這樣的等價表示式,之所以是這種表示式,如前幾章所述,是因為c語言的陣列實現本質上是陣列的巢狀。由於這種等價關係的存在,會產生一些古零精怪的...

第四章 運算子的本質

陣列是存在於人們頭腦中的乙個邏輯概念,而編譯器其實並不知道有陣列這個東西,它所知道的,只是運算子,當遇到運算子的時候,編譯器只是簡單地把它轉換為類似 a i j 這樣的等價表示式,之所以是這種表示式,如前幾章所述,是因為c語言的陣列實現本質上是陣列的巢狀。由於這種等價關係的存在,會產生一些古零精怪的...