免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
c++運(yùn)算符重載總結(jié)

c++的一大特性就是重載(overload),通過重載可以把功能相似的幾個(gè)函數(shù)合為一個(gè),使得程序更加簡潔、高效。在c++中不止函數(shù)可以重載,運(yùn)算符也可以重載。由于一般數(shù)據(jù)類型間的運(yùn)算符沒有重載的必要,所以運(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ù)的形式比較簡單,就是在類里面定義了一個(gè)與操作符相關(guān)的函數(shù)。友元函數(shù)因?yàn)闆]有this指針,所以形參會(huì)多一個(gè)。

  1. class A
  2. {
  3. public:
  4. A(int d):data(d){}
  5. A operator+(A&);//成員函數(shù)
  6. A operator-(A&);
  7. A operator*(A&);
  8. A operator/(A&);
  9. A operator%(A&);
  10. friend A operator+(A&,A&);//友元函數(shù)
  11. friend A operator-(A&,A&);
  12. friend A operator*(A&,A&);
  13. friend A operator/(A&,A&);
  14. friend A operator%(A&,A&);
  15. private:
  16. int data;
  17. };
  18. //成員函數(shù)的形式
  19. A A::operator+(A &a)
  20. {
  21. return A(data+a.data);
  22. }
  23. A A::operator-(A &a)
  24. {
  25. return A(data-a.data);
  26. }
  27. A A::operator*(A &a)
  28. {
  29. return A(data*a.data);
  30. }
  31. A A::operator/(A &a)
  32. {
  33. return A(data/a.data);
  34. }
  35. A A::operator%(A &a)
  36. {
  37. return A(data%a.data);
  38. }
  39. //友元函數(shù)的形式
  40. A operator+(A &a1,A &a2)
  41. {
  42. return A(a1.data+a2.data);
  43. }
  44. A operator-(A &a1,A &a2)
  45. {
  46. return A(a1.data-a2.data);
  47. }
  48. A operator*(A &a1,A &a2)
  49. {
  50. return A(a1.data*a2.data);
  51. }
  52. A operator/(A &a1,A &a2)
  53. {
  54. return A(a1.data/a2.data);
  55. }
  56. A operator%(A &a1,A &a2)
  57. {
  58. return A(a1.data%a2.data);
  59. }
  60. //然后我們就可以對(duì)類的對(duì)象進(jìn)行+、-、*、/了。
  61. void main(void)
  62. {
  63. A a1(1),a2(2),a3(3);
  64. a1=a2+a3;
  65. //或者
  66. a1=a2.operator+(a3);
  67. }

注意:在進(jìn)行a2+a3的時(shí)候會(huì)出錯(cuò),因?yàn)槲覀冊谏厦鎸?duì)+定義了兩種方法,去掉一種即可。

2.關(guān)系運(yùn)算符重載

因?yàn)楹瘮?shù)體比較簡單,后面我就只給出成員函數(shù)形式的函數(shù)聲明了,關(guān)系運(yùn)算符有==,!=,<,>,<=,>=。

  1. bool operator == (const A& );
  2. bool operator != (const A& );
  3. bool operator < (const A& );
  4. bool operator <= (const A& );
  5. bool operator > (const A& );
  6. bool operator >= (const A& );

3.邏輯運(yùn)算符重載

  1. bool operator || (const A& );
  2. bool operator && (const A& );
  3. bool operator ! ();

4.單目運(yùn)算符重載

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

  1. A& operator + ();
  2. A& operator - ();
  3. A* operator & ();
  4. A& operator * ();

5.自增減運(yùn)算符重載

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

  1. A& operator ++ ();//前置++
  2. A operator ++ (int);//后置++
  3. A& operator --();//前置--
  4. A operator -- (int);//后置--

6.位運(yùn)算符重載

按位操作。

  1. A operator | (const A& );
  2. A operator & (const A& );
  3. A operator ^ (const A& );
  4. A operator << (int i);
  5. A operator >> (int i);
  6. A operator ~ ();

7.賦值運(yùn)算符重載

沒有=哦。

  1. A& operator += (const A& );
  2. A& operator -= (const A& );
  3. A& operator *= (const A& );
  4. A& operator /= (const A& );
  5. A& operator %= (const A& );
  6. A& operator &= (const A& );
  7. A& operator |= (const A& );
  8. A& operator ^= (const A& );
  9. A& operator <<= (int i);
  10. A& operator >>= (int i);

8.內(nèi)存運(yùn)算符重載

  1. void *operator new(size_t size);
  2. void *operator new(size_t size, int i);
  3. void *operator new[](size_t size);
  4. void operator delete(void*p);
  5. void operator delete(void*p, int i, int j);
  6. void operator delete [](void* p);

9.特殊運(yùn)算符重載

上面的運(yùn)算符重載都有兩種方式,而下面的運(yùn)算符只能用一種,特殊吧。這些運(yùn)算符的重載只能是成員函數(shù)。

  1. A& operator = (const A& );
  2. char operator [] (int i);//返回值不能作為左值
  3. const char* operator () ();
  4. T operator -> ();
  5. //類型轉(zhuǎn)換符
  6. operator char* () const;
  7. operator int ();
  8. operator const char () const;
  9. operator short int () const;
  10. operator long long () const;
  11. //還有很多就不寫了

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

  1. friend inline ostream &operator << (ostream&, A&);//輸出流
  2. 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ù)來實(shí)現(xiàn)。
  • 當(dāng)需要重載運(yùn)算符具有可交換性時(shí),選擇重載為友元函數(shù)。
注意事項(xiàng):
  1. 除了類屬關(guān)系運(yùn)算符"."、成員指針運(yùn)算符".*"、作用域運(yùn)算符"::"、sizeof運(yùn)算符和三目運(yùn)算符"?:"以外,C++中的所有運(yùn)算符都可以重載。
  2. 重載運(yùn)算符限制在C++語言中已有的運(yùn)算符范圍內(nèi)的允許重載的運(yùn)算符之中,不能創(chuàng)建新的運(yùn)算符。
  3. 運(yùn)算符重載實(shí)質(zhì)上是函數(shù)重載,因此編譯程序?qū)\(yùn)算符重載的選擇,遵循函數(shù)重載的選擇原則。
  4. 重載之后的運(yùn)算符不能改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,也不能改變運(yùn)算符操作數(shù)的個(gè)數(shù)及語法結(jié)構(gòu)。
  5. 運(yùn)算符重載不能改變該運(yùn)算符用于內(nèi)部類型對(duì)象的含義。它只能和用戶自定義類型的對(duì)象一起使用,或者用于用戶自定義類型的對(duì)象和內(nèi)部類型的對(duì)象混合使用時(shí)。
  6. 運(yùn)算符重載是針對(duì)新類型數(shù)據(jù)的實(shí)際需要對(duì)原有運(yùn)算符進(jìn)行的適當(dāng)?shù)母脑?,重載的功能應(yīng)當(dāng)與原有功能相類似,避免沒有目的地使用重載運(yùn)算符。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++_運(yùn)算符重載
運(yùn)算符重載詳解
C++ operator關(guān)鍵字(重載操作符)
C++ Primer第一章擴(kuò)展閱讀
C++ 中重載 + 操作符的正確方法
操作符重載
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服