日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c 运算符重载总结

發(fā)布時間:2025/3/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c 运算符重载总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

1.一般運算符重載 2.關(guān)系運算符重載 3.邏輯運算符重載 4.單目運算符重載 5.自增減運算符重載 6.位運算符重載 7.賦值運算符重載 8.內(nèi)存運算符重載 9.特殊運算符重載 10.總結(jié)

c++的一大特性就是重載(overload),通過重載可以把功能相似的幾個函數(shù)合為一個,使得程序更加簡潔、高效。在c++中不止函數(shù)可以重載,運算符也可以重載。由于一般數(shù)據(jù)類型間的運算符沒有重載的必要,所以運算符重載主要是面向?qū)ο笾g的。
1.一般運算符重載
在進(jìn)行對象之間的運算時,程序會調(diào)用與運算符相對應(yīng)的函數(shù)進(jìn)行處理,所以運算符重載有兩種方式:成員函數(shù)和友元函數(shù)。成員函數(shù)的形式比較簡單,就是在類里面定義了一個與操作符相關(guān)的函數(shù)。友元函數(shù)因為沒有this指針,所以形參會多一個。

class A { public: A(int d):data(d){} A operator+(A&);//成員函數(shù) A operator-(A&); A operator*(A&); A operator/(A&); A operator%(A&); friend A operator+(A&,A&);//友元函數(shù) friend A operator-(A&,A&); friend A operator*(A&,A&); friend A operator/(A&,A&); friend A operator%(A&,A&); private: int data; }; //成員函數(shù)的形式 A A::operator+(A &a) { return A(data+a.data); } A A::operator-(A &a) { return A(data-a.data); } A A::operator*(A &a) { return A(data*a.data); } A A::operator/(A &a) { return A(data/a.data); } A A::operator%(A &a) { return A(data%a.data); } //友元函數(shù)的形式 A operator+(A &a1,A &a2) { return A(a1.data+a2.data); } A operator-(A &a1,A &a2) { return A(a1.data-a2.data); } A operator*(A &a1,A &a2) { return A(a1.data*a2.data); } A operator/(A &a1,A &a2) { return A(a1.data/a2.data); } A operator%(A &a1,A &a2) { return A(a1.data%a2.data); } //然后我們就可以對類的對象進(jìn)行+、-、*、/了。 void main(void) { A a1(1),a2(2),a3(3); a1=a2+a3; //或者 a1=a2.operator+(a3); }

注意:在進(jìn)行a2+a3的時候會出錯,因為我們在上面對+定義了兩種方法,去掉一種即可。
2.關(guān)系運算符重載
因為函數(shù)體比較簡單,后面我就只給出成員函數(shù)形式的函數(shù)聲明了,關(guān)系運算符有==,!=,<,>,<=,>=。

bool operator == (const A& ); bool operator != (const A& ); bool operator < (const A& ); bool operator <= (const A& ); bool operator > (const A& ); bool operator >= (const A& );

3.邏輯運算符重載

bool operator || (const A& ); bool operator && (const A& ); bool operator ! ();

4.單目運算符重載

這里的+、-是正負(fù)的意思,放在對象前面。

A& operator + (); A& operator - (); A* operator & (); A& operator * ();

5.自增減運算符重載

++和–根據(jù)位置的不同有四種情況,都可以重載。

A& operator ++ ();//前置++ A operator ++ (int);//后置++ A& operator --();//前置-- A operator -- (int);//后置--

6.位運算符重載

按位操作。

A operator | (const A& ); A operator & (const A& ); A operator ^ (const A& ); A operator << (int i); A operator >> (int i); A operator ~ ();

7.賦值運算符重載

沒有=哦。

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)存運算符重載

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.特殊運算符重載

上面的運算符重載都有兩種方式,而下面的運算符只能用一種,特殊吧。 這些運算符的重載只能是成員函數(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; //還有很多就不寫了

而這些只能以友元函數(shù)的形式重載

friend inline ostream &operator << (ostream&, A&);//輸出流 friend inline istream &operator >> (istream&, A&);//輸入流

10.總結(jié)

兩種重載方式的比較:

一般情況下,單目運算符最好重載為類的成員函數(shù);雙目運算符則最好重載為類的友元函數(shù)。 以下一些雙目運算符不能重載為類的友元函數(shù):=、()、[]、->。 類型轉(zhuǎn)換函數(shù)只能定義為一個類的成員函數(shù)而不能定義為類的友元函數(shù)。 C++提供4個類型轉(zhuǎn)換函數(shù):reinterpret_cast(在編譯期間實現(xiàn)轉(zhuǎn)換)、const_cast(在編譯期間實現(xiàn)轉(zhuǎn)換)、stactic_cast(在編譯期間實現(xiàn)轉(zhuǎn)換)、dynamic_cast(在運行期間實現(xiàn)轉(zhuǎn)換,并可以返回轉(zhuǎn)換成功與否的標(biāo)志)。 若一個運算符的操作需要修改對象的狀態(tài),選擇重載為成員函數(shù)較好。 若運算符所需的操作數(shù)(尤其是第一個操作數(shù))希望有隱式類型轉(zhuǎn)換,則只能選用友元函數(shù)。 當(dāng)運算符函數(shù)是一個成員函數(shù)時,最左邊的操作數(shù)(或者只有最左邊的操作數(shù))必須是運算符類的一個類對象(或者是對該類對象的引用)。如果左邊的操作數(shù)必須是一個不同類的對象,或者是一個內(nèi)部 類型的對象,該運算符函數(shù)必須作為一個友元函數(shù)來實現(xiàn)。 當(dāng)需要重載運算符具有可交換性時,選擇重載為友元函數(shù)。

注意事項:

除了類屬關(guān)系運算符"."、成員指針運算符".*"、作用域運算符"::"、sizeof運算符和三目運算符"?:"以外,C++中的所有運算符都可以重載。 重載運算符限制在C++語言中已有的運算符范圍內(nèi)的允許重載的運算符之中,不能創(chuàng)建新的運算符。 運算符重載實質(zhì)上是函數(shù)重載,因此編譯程序?qū)\算符重載的選擇,遵循函數(shù)重載的選擇原則。 重載之后的運算符不能改變運算符的優(yōu)先級和結(jié)合性,也不能改變運算符操作數(shù)的個數(shù)及語法結(jié)構(gòu)。 運算符重載不能改變該運算符用于內(nèi)部類型對象的含義。它只能和用戶自定義類型的對象一起使用,或者用于用戶自定義類型的對象和內(nèi)部類型的對象混合使用時。 運算符重載是針對新類型數(shù)據(jù)的實際需要對原有運算符進(jìn)行的適當(dāng)?shù)母脑?#xff0c;重載的功能應(yīng)當(dāng)與原有功能相類似,避免沒有目的地使用重載運算符。

總結(jié)

以上是生活随笔為你收集整理的c 运算符重载总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。