目錄定義:重新定義運算子的運算
實質是函式過載,把含有運算子的表示式轉換成對運算子函式的呼叫
可以過載為普通函式、成員函式、友元函式
多次過載時,根據實參型別決定呼叫哪個運算子函式
等號只能過載為成員函式
賦值語句和初始化語句的等號=
含義不同,初始化語句需要用建構函式實現
同類賦值注意點(可能包含指標)
深拷貝:釋放原有記憶體空間,並重新動態分配一塊記憶體
在拷貝前應檢查是否拷貝自身(即if(this=&s)
,會造成自身內部空間先被delete,導致複製出錯),是則直接return *this
返回值應為classname&
,void
和classname
有缺陷[1]
a=b=c; //連續賦值,void不行
(a=b)=c; //結果為a=c; classname不行
使用複製拷貝函式時,需要考慮類似的問題
string& string::operator= (const string &s)else
return *this;
}
非引用的函式返回值不能作為左值使用[2]
賦值和初始化時採用深拷貝
cout
和cin
分別是ostream
和istream
類的物件,類中分別對<<
和>>
運算子進行了過載
可全域性過載>>
和<<
運算子,使其滿足要求
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語言的陣列實現本質上是陣列的巢狀。由於這種等價關係的存在,會產生一些古零精怪的...