c 运算符重载总结
目錄
1.一般運(yùn)算符重載 2.關(guān)系運(yùn)算符重載 3.邏輯運(yùn)算符重載 4.單目運(yùn)算符重載 5.自增減運(yùn)算符重載 6.位運(yùn)算符重載 7.賦值運(yùn)算符重載 8.內(nèi)存運(yùn)算符重載 9.特殊運(yùn)算符重載 10.總結(jié)c++的一大特性就是重載(overload),通過(guò)重載可以把功能相似的幾個(gè)函數(shù)合為一個(gè),使得程序更加簡(jiǎn)潔、高效。在c++中不止函數(shù)可以重載,運(yùn)算符也可以重載。由于一般數(shù)據(jù)類型間的運(yùn)算符沒(méi)有重載的必要,所以運(yùn)算符重載主要是面向?qū)ο笾g的。
1.一般運(yùn)算符重載
在進(jìn)行對(duì)象之間的運(yùn)算時(shí),程序會(huì)調(diào)用與運(yùn)算符相對(duì)應(yīng)的函數(shù)進(jìn)行處理,所以運(yùn)算符重載有兩種方式:成員函數(shù)和友元函數(shù)。成員函數(shù)的形式比較簡(jiǎn)單,就是在類里面定義了一個(gè)與操作符相關(guān)的函數(shù)。友元函數(shù)因?yàn)闆](méi)有this指針,所以形參會(huì)多一個(gè)。
注意:在進(jìn)行a2+a3的時(shí)候會(huì)出錯(cuò),因?yàn)槲覀冊(cè)谏厦鎸?duì)+定義了兩種方法,去掉一種即可。
2.關(guān)系運(yùn)算符重載
因?yàn)楹瘮?shù)體比較簡(jiǎn)單,后面我就只給出成員函數(shù)形式的函數(shù)聲明了,關(guān)系運(yùn)算符有==,!=,<,>,<=,>=。
3.邏輯運(yùn)算符重載
bool operator || (const A& ); bool operator && (const A& ); bool operator ! ();4.單目運(yùn)算符重載
這里的+、-是正負(fù)的意思,放在對(duì)象前面。
A& operator + (); A& operator - (); A* operator & (); A& operator * ();5.自增減運(yùn)算符重載
++和–根據(jù)位置的不同有四種情況,都可以重載。
A& operator ++ ();//前置++ A operator ++ (int);//后置++ A& operator --();//前置-- A operator -- (int);//后置--6.位運(yùn)算符重載
按位操作。
A operator | (const A& ); A operator & (const A& ); A operator ^ (const A& ); A operator << (int i); A operator >> (int i); A operator ~ ();7.賦值運(yùn)算符重載
沒(méi)有=哦。
A& operator += (const A& ); A& operator -= (const A& ); A& operator *= (const A& ); A& operator /= (const A& ); A& operator %= (const A& ); A& operator &= (const A& ); A& operator |= (const A& ); A& operator ^= (const A& ); A& operator <<= (int i); A& operator >>= (int i);8.內(nèi)存運(yùn)算符重載
void *operator new(size_t size); void *operator new(size_t size, int i); void *operator new[](size_t size); void operator delete(void*p); void operator delete(void*p, int i, int j); void operator delete [](void* p);9.特殊運(yùn)算符重載
上面的運(yùn)算符重載都有兩種方式,而下面的運(yùn)算符只能用一種,特殊吧。 這些運(yùn)算符的重載只能是成員函數(shù)。
A& operator = (const A& ); char operator [] (int i);//返回值不能作為左值 const char* operator () (); T operator -> (); //類型轉(zhuǎn)換符 operator char* () const; operator int (); operator const char () const; operator short int () const; operator long long () const; //還有很多就不寫(xiě)了而這些只能以友元函數(shù)的形式重載
friend inline ostream &operator << (ostream&, A&);//輸出流 friend inline istream &operator >> (istream&, A&);//輸入流10.總結(jié)
兩種重載方式的比較:
一般情況下,單目運(yùn)算符最好重載為類的成員函數(shù);雙目運(yùn)算符則最好重載為類的友元函數(shù)。 以下一些雙目運(yùn)算符不能重載為類的友元函數(shù):=、()、[]、->。 類型轉(zhuǎn)換函數(shù)只能定義為一個(gè)類的成員函數(shù)而不能定義為類的友元函數(shù)。 C++提供4個(gè)類型轉(zhuǎn)換函數(shù):reinterpret_cast(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)、const_cast(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)、stactic_cast(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)、dynamic_cast(在運(yùn)行期間實(shí)現(xiàn)轉(zhuǎn)換,并可以返回轉(zhuǎn)換成功與否的標(biāo)志)。 若一個(gè)運(yùn)算符的操作需要修改對(duì)象的狀態(tài),選擇重載為成員函數(shù)較好。 若運(yùn)算符所需的操作數(shù)(尤其是第一個(gè)操作數(shù))希望有隱式類型轉(zhuǎn)換,則只能選用友元函數(shù)。 當(dāng)運(yùn)算符函數(shù)是一個(gè)成員函數(shù)時(shí),最左邊的操作數(shù)(或者只有最左邊的操作數(shù))必須是運(yùn)算符類的一個(gè)類對(duì)象(或者是對(duì)該類對(duì)象的引用)。如果左邊的操作數(shù)必須是一個(gè)不同類的對(duì)象,或者是一個(gè)內(nèi)部 類型的對(duì)象,該運(yùn)算符函數(shù)必須作為一個(gè)友元函數(shù)來(lái)實(shí)現(xiàn)。 當(dāng)需要重載運(yùn)算符具有可交換性時(shí),選擇重載為友元函數(shù)。注意事項(xiàng):
除了類屬關(guān)系運(yùn)算符"."、成員指針運(yùn)算符".*"、作用域運(yùn)算符"::"、sizeof運(yùn)算符和三目運(yùn)算符"?:"以外,C++中的所有運(yùn)算符都可以重載。 重載運(yùn)算符限制在C++語(yǔ)言中已有的運(yùn)算符范圍內(nèi)的允許重載的運(yùn)算符之中,不能創(chuàng)建新的運(yùn)算符。 運(yùn)算符重載實(shí)質(zhì)上是函數(shù)重載,因此編譯程序?qū)\(yùn)算符重載的選擇,遵循函數(shù)重載的選擇原則。 重載之后的運(yùn)算符不能改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,也不能改變運(yùn)算符操作數(shù)的個(gè)數(shù)及語(yǔ)法結(jié)構(gòu)。 運(yùn)算符重載不能改變?cè)撨\(yùn)算符用于內(nèi)部類型對(duì)象的含義。它只能和用戶自定義類型的對(duì)象一起使用,或者用于用戶自定義類型的對(duì)象和內(nèi)部類型的對(duì)象混合使用時(shí)。 運(yùn)算符重載是針對(duì)新類型數(shù)據(jù)的實(shí)際需要對(duì)原有運(yùn)算符進(jìn)行的適當(dāng)?shù)母脑?#xff0c;重載的功能應(yīng)當(dāng)與原有功能相類似,避免沒(méi)有目的地使用重載運(yùn)算符。總結(jié)
- 上一篇: C++ 私有构造函数的作用
- 下一篇: C 中的static关键字