亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入解析C++編程中的運算符重載

2020-05-23 14:06:03
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++編程中的運算符重載,運算符重載是C++入門學習中的基礎知識,需要的朋友可以參考下
 

C++中預定義的運算符的操作對象只能是基本數據類型,實際上,對于很多用戶自定義類型,也需要有類似的運算操作。例如: 

class complex {  public:  complex(double r=0.0,double I=0.0){real=r;imag=I;}  void display();  private:  double real;  double imag; }; complex a(10,20),b(5,8); 

“a+b”運算如何實現?這時候我們需要自己編寫程序來說明“+”在作用于complex類對象時,該實現什么樣的功能,這就是運算符重載。運算符重載是對已有的運算符賦予多重含義,使同一個運算符作用于不同類型的數據導致不同類型的行為。 
運算符重載的實質是函數重載。在實現過程中,首先把指定的運算表達式轉化為對運算符函數的調用,運算對象轉化為運算符函數的實參,然后根據實參的類型來確定需要調用達標函數,這個過程愛編譯過程中完成。

一、 運算符重載的規則 
運算符重載規則如下: 
①、 C++中的運算符除了少數幾個之外,全部可以重載,而且只能重載C++中已有的運算符。 
②、 重載之后運算符的優先級和結合性都不會改變。 
③、 運算符重載是針對新類型數據的實際需要,對原有運算符進行適當的改造。一般來說,重載的功能應當與原有功能相類似,不能改變原運算符的操作對象個數,同時至少要有一個操作對象是自定義類型。 
不能重載的運算符只有五個,它們是:成員運算符“.”、指針運算符“*”、作用域運算符“::”、“sizeof”、條件運算符“?:”。 
運算符重載形式有兩種,重載為類的成員函數和重載為類的友元函數。 
運算符重載為類的成員函數的一般語法形式為: 

函數類型 operator 運算符(形參表) {  函數體; } 

運算符重載為類的友元函數的一般語法形式為: 

friend 函數類型 operator 運算符(形參表) {  函數體; } 

其中,函數類型就是運算結果類型;operator是定義運算符重載函數的關鍵字;運算符是重載的運算符名稱。 
當運算符重載為類的成員函數時,函數的參數個數比原來的操作個數要少一個;當重載為類的友元函數時,參數個數與原操作數個數相同。原因是重載為類的成員函數時,如果某個對象使用重載了的成員函數,自身的數據可以直接訪問,就不需要再放在參數表中進行傳遞,少了的操作數就是該對象本身。而重載為友元函數時,友元函數對某個對象的數據進行操作,就必須通過該對象的名稱來進行,因此使用到的參數都要進行傳遞,操作數的個數就不會有變化。 
運算符重載的主要優點就是允許改變使用于系統內部的運算符的操作方式,以適應用戶自定義類型的類似運算。

二、 運算符重載為成員函數 
對于雙目運算符B,如果要重載B為類的成員函數,使之能夠實現表達式oprd1 B oprd2,其中oprd1為類A的對象,則應當把B重載為A類的成員函數,該函數只有一個形參,形參的類型是oprd2所屬的類型。經過重載后,表達式oprd1 B oprd2 就相當于函數調用oprd1.operator B(oprd2). 
對于前置單目運算符U,如“-”(負號)等,如果要重載U為類的成員函數,用來實現表達式U oprd,其中oprd為A類的對象,則U應當重載為A類的成員函數,函數沒有形參。經過重載之后,表達式U oprd相當于函數調用oprd.operator U(). 
對于后置運算符“++”和“- -”,如果要將它們重載為類的成員函數,用來實現表達式oprd++或oprd--,其中oprd為A類的對象,那么運算符就應當重載為A類的成員函數,這時函數要帶有一個整型形參。重載之后,表達式oprd++和oprd—就想當于函數調用oprd.operator++(0)和oprd.operator—(0); 
運算符重載就是賦予已有的運算符多重含義。通過重新定義運算符,使它能夠用于特定類的對象執行特定的功能,這便增強了C++語言的擴充能力。
 
1. 運算符重載的作用:
運算符重載允許C/C++的運算符在用戶定義類型(類)上擁有一個用戶定義的意義。重載的運算符是函數調用的語法修飾:

class Fred{public:// ...}; #if 0// 沒有算符重載:Fred add(Fred, Fred);Fred mul(Fred, Fred); Fred f(Fred a, Fred b, Fred c){return add(add(mul(a,b), mul(b,c)), mul(c,a)); // 哈哈,多可笑...}#else// 有算符重載:Fred operator+ (Fred, Fred);Fred operator* (Fred, Fred); Fred f(Fred a, Fred b, Fred c){return a*b + b*c + c*a;}#endif

 
2. 可以用作重載的運算符:
算術運算符:+,-,*,/,%,++,--;
位操作運算符:&,|,~,^,<<,>>
邏輯運算符:!,&&,||;
比較運算符:<,>,>=,<=,==,!=;
賦值運算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他運算符:[],(),->,,(逗號運算符),new,delete,new[],delete[],->*。
下列運算符不允許重載:
.,.*,::,?:
 
3. 運算符重載后,優先級和結合性:
用戶重載新定義運算符,不改變原運算符的優先級和結合性。這就是說,對運算符重載不改變運算符的優先級和結合性,并且運算符重載后,也不改變運算符的語法結構,即單目運算符只能重載為單目運算符,雙目運算符只能重載雙目運算符。
 
4. 編譯程序如何選用哪一個運算符函數:
運算符重載實際是一個函數,所以運算符的重載實際上是函數的重載。編譯程序對運算符重載的選擇,遵循著函數重載的選擇原則。當遇到不很明顯的運算時,編譯程序將去尋找參數相匹配的運算符函數。
 
5. 重載運算符有哪些限制:
(1) 不可臆造新的運算符。必須把重載運算符限制在C++語言中已有的運算符范圍內的允許重載的運算符之中。
(2) 重載運算符堅持4個“不能改變”。
·不能改變運算符操作數的個數;
·不能改變運算符原有的優先級;
·不能改變運算符原有的結合性;
·不能改變運算符原有的語法結構。
 
6. 運算符重載時必須遵循哪些原則:
運算符重載可以使程序更加簡潔,使表達式更加直觀,增加可讀性。但是,運算符重載使用不宜過多,否則會帶來一定的麻煩。
(1) 重載運算符含義必須清楚。
(2) 重載運算符不能有二義性。
運算符重載函數的兩種形式
運算符重載的函數一般地采用如下兩種形式:成員函數形式和友元函數形式。這兩種形式都可訪問類中的私有成員。

三、例子
使用全局函數重載

#include <IOSTREAM.H>  class A { public:   A(int i):i(i){};   void print(){cout<<i<<endl;}   friend A operator + (A &a, A &b);//聲明為友元   friend A operator ++(A &a, int);   friend A& operator ++(A &a);   friend A& operator +=(A &a, A &b); protected:   int i; private: };  A operator + (A &a, A &b){//重載 a + b   return A(a.i + b.i); }  A operator ++(A &a, int){//重載 a++   return A(a.i++); }  A& operator ++(A &a){//重載 ++a   a.i++;   return a; }  A& operator +=(A &a, A &b){//重載 +=   a.i += b.i;   return a; }  void main(){   A a(5);   A b(3);   (a += b).print(); } 

 
使用成員函數重載

#include <IOSTREAM.H>  class A { public:   A(int i):i(i){};   void print(){cout<<i<<endl;}   A operator + (A &b);   A& operator += (A &b);   A operator ++(int);   A& operator ++(); protected:   int i; private: };  A A::operator + (A &b){//重載 +   return A(i + b.i); }  A& A::operator+= (A &b){   i += b.i;   return *this; }  A A::operator++ (int){//i++   return A(i++); }  A& A::operator ++(){//++i   i++;   return *this; }  void main(){   A a = 2;   A b = 3;   (++a).print();   (b++).print(); } 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
人人做人人澡人人爽欧美| 中国人与牲禽动交精品| 91香蕉国产在线观看| 久久精品91久久香蕉加勒比| 亚洲男人的天堂网站| 国产精选久久久久久| 久久免费少妇高潮久久精品99| 国内免费久久久久久久久久久| 激情亚洲一区二区三区四区| 热re99久久精品国产66热| 亚洲综合成人婷婷小说| 色99之美女主播在线视频| www.久久撸.com| 日韩免费观看网站| 成人激情在线播放| 久热精品视频在线免费观看| 国产精品伦子伦免费视频| 超碰日本道色综合久久综合| 亚洲情综合五月天| 久久久久久久久久国产精品| 精品亚洲男同gayvideo网站| 国产成人精品一区二区在线| 尤物yw午夜国产精品视频| 日韩欧美在线中文字幕| 国产在线98福利播放视频| 午夜精品久久久久久久白皮肤| 精品国产31久久久久久| 欧美久久精品午夜青青大伊人| 日韩精品在线观看一区二区| 色偷偷av一区二区三区乱| 亚洲va码欧洲m码| 热99久久精品| 中文字幕一区二区三区电影| 欧美日韩国产综合视频在线观看中文| 亚洲成人精品在线| 成人国产精品一区二区| 一区二区亚洲欧洲国产日韩| 国产免费一区视频观看免费| 久久好看免费视频| 国产一区在线播放| 日韩欧美第一页| 久久久视频在线| 精品福利在线观看| 国产精品91一区| 色与欲影视天天看综合网| 亚洲最大的网站| 国产成人激情视频| 色偷偷综合社区| 欧美理论电影网| 成人a视频在线观看| 欧美精品免费在线观看| 亚洲欧美一区二区三区在线| 亚洲欧洲一区二区三区久久| 精品亚洲夜色av98在线观看| 91精品国产91久久久久久吃药| 欧美性xxxxxxx| 国内精品久久久久久久| 色悠悠久久久久| 欧美日韩国产999| 国产欧美亚洲精品| 欧美精品videos| 亚洲人成在线免费观看| 在线激情影院一区| 亚洲国产精品成人一区二区| 中文字幕亚洲综合久久筱田步美| 久久久人成影片一区二区三区| 91中文在线视频| 日本在线观看天堂男亚洲| 欧美日韩国产限制| 国产亚洲激情视频在线| 国产精品国产自产拍高清av水多| 亚洲综合精品一区二区| 日韩av大片在线| 精品成人久久av| 欧美裸体xxxx极品少妇| 国产69精品久久久久9| 欧美日韩人人澡狠狠躁视频| 久久99精品久久久久久青青91| 日韩免费在线播放| 91老司机精品视频| 茄子视频成人在线| 成人在线视频网| 97精品视频在线播放| 国产精品久久久久高潮| 这里只有精品视频在线| 日日噜噜噜夜夜爽亚洲精品| 欧美极度另类性三渗透| 亚洲精品国产拍免费91在线| 成人午夜高潮视频| 亚洲国产欧美精品| 精品久久久精品| 亚洲精品成人免费| 欧美日本在线视频中文字字幕| 欧美精品一本久久男人的天堂| 中文字幕亚洲无线码在线一区| 久久国内精品一国内精品| 欧美午夜片欧美片在线观看| 日本高清不卡的在线| 国产欧美日韩免费看aⅴ视频| 亚洲国产精品网站| 精品亚洲永久免费精品| 欧美激情免费观看| 精品日韩美女的视频高清| 精品亚洲一区二区三区在线播放| 午夜精品一区二区三区在线视| 亚洲第一福利视频| 亚洲国产婷婷香蕉久久久久久| 欧美日韩成人在线播放| 98精品国产自产在线观看| 亚洲精品少妇网址| 亚洲欧美日韩天堂一区二区| 亚洲女人初尝黑人巨大| 久久久久国产精品一区| 青青久久av北条麻妃海外网| 在线电影欧美日韩一区二区私密| 欧美精品激情在线观看| 欧美大人香蕉在线| 韩国日本不卡在线| 91夜夜未满十八勿入爽爽影院| 久久久女女女女999久久| 欧美天天综合色影久久精品| 欧美精品国产精品日韩精品| 国产黑人绿帽在线第一区| 久久久久久美女| 狠狠躁夜夜躁人人爽天天天天97| 91亚洲国产成人精品性色| 久久国产精品久久久| 91av在线影院| 最近2019中文字幕一页二页| 欧美重口另类videos人妖| 欧美国产在线电影| 国产色综合天天综合网| 亚洲欧美日韩国产精品| 黑人欧美xxxx| 狠狠色狠色综合曰曰| 成人xvideos免费视频| www.亚洲免费视频| 久久久人成影片一区二区三区| 欧美激情亚洲国产| 欧美成人亚洲成人日韩成人| 国产精品国产三级国产专播精品人| 亚洲精品久久久久中文字幕欢迎你| 亚洲午夜国产成人av电影男同| 美女999久久久精品视频| 久久av在线看| 亚洲国产毛片完整版| 麻豆国产va免费精品高清在线| 精品av在线播放| 美日韩精品免费观看视频| www日韩欧美| 亚洲高清一区二| 97精品国产aⅴ7777| 日韩av免费一区| 91超碰caoporn97人人| 国产精品精品一区二区三区午夜版| 日韩精品久久久久久久玫瑰园| 日韩av在线直播| 一本一道久久a久久精品逆3p| 国产午夜精品理论片a级探花| 日韩电影免费在线观看中文字幕| 欧美午夜视频一区二区| 欧美精品激情blacked18| 国产精品视频一区国模私拍| 黄色成人在线播放|