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

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

C++ operator關鍵字(重載操作符)的用法詳解

2020-05-23 13:55:20
字體:
來源:轉載
供稿:網友

operator是C++的關鍵字,它和運算符一起使用,表示一個運算符函數,理解時應將operator=整體上視為一個函數名。

這是C++擴展運算符功能的方法,雖然樣子古怪,但也可以理解:一方面要使運算符的使用方法與其原來一致,另一方面擴展其功能只能通過函數的方式(c++中,“功能”都是由函數實現的)。

 一、為什么使用操作符重載?

對于系統的所有操作符,一般情況下,只支持基本數據類型和標準庫中提供的class,對于用戶自己定義的class,如果想支持基本操作,比如比較大小,判斷是否相等,等等,則需要用戶自己來定義關于這個操作符的具體實現。比如,判斷兩個人是否一樣大,我們默認的規則是按照其年齡來比較,所以,在設計person 這個class的時候,我們需要考慮操作符==,而且,根據剛才的分析,比較的依據應該是age。那么為什么叫重載呢?這是因為,在編譯器實現的時候,已經為我們提供了這個操作符的基本數據類型實現版本,但是現在他的操作數變成了用戶定義的數據類型class,所以,需要用戶自己來提供該參數版本的實現。

二、如何聲明一個重載的操作符?

A:  操作符重載實現為類成員函數

重載的操作符在類體中被聲明,聲明方式如同普通成員函數一樣,只不過他的名字包含關鍵字operator,以及緊跟其后的一個c++預定義的操作符。

可以用如下的方式來聲明一個預定義的==操作符:

class person{private:  int age;  public:  person(int a){    this->age=a;  }  inline bool operator == (const person &ps) const;};

 

實現方式如下:

inline bool person::operator==(const person &ps) const{   if (this->age==ps.age)    return true;   return false;}

 

調用方式如下:

#includeusing namespace std;int main(){ person p1(10); person p2(20); if(p1==p2) cout<<”the age is equal!”< return 0;}

 

這里,因為operator ==是class person的一個成員函數,所以對象p1,p2都可以調用該函數,上面的if語句中,相當于p1調用函數==,把p2作為該函數的一個參數傳遞給該函數,從而實現了兩個對象的比較。

B:操作符重載實現為非類成員函數(全局函數)

對于全局重載操作符,代表左操作數的參數必須被顯式指定。例如:

#include#includeusing namespace std;class person{public:int age;public:};bool operator==(person const &p1 ,person const & p2)//滿足要求,做操作數的類型被顯示指定{if(p1.age==p2.age)return true;return false;}int main(){person rose;person jack;rose.age=18;jack.age=23;if(rose==jack)cout<<"ok"< return 0;}

 

C:如何決定把一個操作符重載為類成員函數還是全局名字空間的成員呢?

①如果一個重載操作符是類成員,那么只有當與他一起使用的左操作數是該類的對象時,該操作符才會被調用。如果該操作符的左操作數必須是其他的類型,則操作符必須被重載為全局名字空間的成員。

②C++要求賦值=,下標[],調用(), 和成員指向-> 操作符必須被定義為類成員操作符。任何把這些操作符定義為名字空間成員的定義都會被標記為編譯時刻錯誤。

③如果有一個操作數是類類型如string類的情形那么對于對稱操作符比如等于操作符最好定義為全局名字空間成員。

D:重載操作符具有以下限制:

(1)只有C++預定義的操作符集中的操作符才可以被重載;

C++,operator,重載

 

 

(2)對于內置類型的操作符,它的預定義不能被改變,應不能為內置類型重載操作符,如,不能改變int型的操作符+的含義;

(3) 也不能為內置的數據類型定義其它的操作符;

(4) 只能重載類類型或枚舉類型的操作符;

(5) 重載操作符不能改變它們的操作符優先級;

(6) 重載操作符不能改變操作數的個數;

(7) 除了對( )操作符外,對其他重載操作符提供缺省實參都是非法的;

E: 注意點

(1)后果載操操作符首先要確定它的返回值是左值,還是右值,如果是左值最返回引用,如果是右值那就直接返回值;

(2) +號等這樣的操作符沒有對象可以容納改變后值,對于這樣的情況最好返回數值,否則只能要操作符體內創建臨時對象用于容納改變后的值,如果在堆中創建臨時對象返回指針或者引用,在操作符函數體外還需要釋放它,如果返回的對象而不是引用或者指針,那么效率是比較低的。如果返回的是數值,最好在該類的構造函數中增加對該類型數值的轉換函數,如:返回值是int類型,那么最好有一個int類型作為參數的構造函數。

(3)在增量運算符中,放上一個整數形參,就是后增量運行符,它是值返回,對于前增量沒有形參,而且是引用返回,示例:

class Test{  public:  Test(x=3){ m_value = x}  Test &operator ++();  //前增量  Test &operator ++(int);//后增量private:  Int m_value:};Test &Test::operator ++(){  m_value ++;  //先增量  return *this; //返回當前對象}Test Test::operator ++(int){  Test tmp(*this); //創建臨時對象  m_value ++;    //再增量  return temp;   //返回臨時對象}

 

(4)因為強制轉換是針對基本數據類型的,所以對類類型的轉換需自定義;

(5) 轉換運行符重載聲明形式:operator 類型名();它沒有返回類型,因為類型名就代表了它的返回類型,所以返回類型顯得多余。

(6)一般來說,轉換運算符與轉換構造函數(即帶一個參數的構造函數)是互逆的,如有了構造函數Test(int),那么最好有一個轉換運算符int()。這樣就不必提供對象參數重載運算符了,如Test a1(1);Test a2(2); Test a3; a3 = a1+a2;就不需要重載+號操作符了,因為對于a1+a2的運算,系統可能會先找有沒有定義針對Test的+號操作符,如果沒有,它就會找有沒有針對Test類轉換函數參數類型的+號操作符(因為可以將+號運行結果的類型通過轉換函數轉換為Test對象),因為Test類有個int類型的參數,對于int類型有+操作符,所以a1+a2真正執行的是Test(int(a1) + int(a2));即Test(3);

(7)對于轉換運算符,還有一個需要注意的地方就是,如果A類中有以B為參數的轉換函數(構造函數),那B中不能有A的轉換運算符,不然就存在轉換的二義性,如:

class A{A(B&){…}}; class B{ operator A(){…}};

那么以下語句就會有問題:

B b; A(b);//A(b)有就可能是A的構造函數,也可以是B的轉換運算符

以上就是小編為大家帶來的C++ operator關鍵字(重載操作符)的用法詳解全部內容了,希望大家多多支持VEVB武林網~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产成人精品女人久久久| 亚洲电影免费观看高清完整版在线观看| 国产精选久久久久久| 亚洲女人天堂色在线7777| 日韩电影中文字幕av| 国产精品亚发布| 国产精品av电影| 亚洲美女激情视频| 成人午夜小视频| 欧美肥老妇视频| 亚洲第一色在线| 国产成人精品国内自产拍免费看| 国产精品久久久一区| 国产成人精品日本亚洲专区61| 久久精品美女视频网站| 7777kkkk成人观看| 96pao国产成视频永久免费| 欧美乱大交xxxxx另类电影| www.日韩av.com| 欧美激情精品久久久久久黑人| 欧美综合国产精品久久丁香| 成人欧美一区二区三区黑人孕妇| 91国产精品电影| 欧美午夜www高清视频| 欧美国产日韩精品| 国产精品一香蕉国产线看观看| 成人国产在线视频| 国产精品天天狠天天看| 欧美一级视频在线观看| 国产一区二区日韩精品欧美精品| 狠狠躁夜夜躁人人爽超碰91| 91国产精品视频在线| 亚洲国产一区二区三区在线观看| 亚洲欧洲在线观看| 久久精品中文字幕免费mv| 久久综合网hezyo| 国产伊人精品在线| 欧美大片在线免费观看| 欧美黑人一级爽快片淫片高清| 国内免费精品永久在线视频| 黑人巨大精品欧美一区免费视频| 日韩精品免费电影| 国产精品日韩欧美综合| 欧美精品在线播放| 久久69精品久久久久久国产越南| 久久黄色av网站| 97成人精品区在线播放| 538国产精品视频一区二区| 国产成人欧美在线观看| 午夜精品在线观看| 欧美在线一级视频| 国产精品美女久久久久av超清| 国产精品黄色影片导航在线观看| 色与欲影视天天看综合网| 亚洲精品videossex少妇| 国产亚洲精品一区二555| 97av视频在线| 日韩最新免费不卡| 亚洲国产一区二区三区在线观看| 国产精品久久久久久久久| 欧美激情亚洲另类| 国产精品中文久久久久久久| 国产精品永久免费| 国产精品久久久久不卡| 欧美性猛交xxxx乱大交| 热久久这里只有精品| 亚洲一区二区三区乱码aⅴ| 国语自产精品视频在线看一大j8| 国产成人aa精品一区在线播放| 奇米成人av国产一区二区三区| 亚洲成年网站在线观看| 国内精品在线一区| 国产成人精品久久二区二区91| 欧美日韩福利在线观看| 日韩在线视频中文字幕| 久久亚洲春色中文字幕| 日韩免费在线免费观看| www.欧美精品一二三区| 国产视频综合在线| 欧美成人精品不卡视频在线观看| 欧美福利视频在线观看| 黑人极品videos精品欧美裸| 日韩不卡在线观看| 日本乱人伦a精品| 久久亚洲综合国产精品99麻豆精品福利| 国产一区二区精品丝袜| 91免费高清视频| 日韩视频在线免费观看| 亚洲精品国产精品国自产在线| 亚洲自拍另类欧美丝袜| 日韩最新中文字幕电影免费看| 国产精品福利在线观看| 伊人亚洲福利一区二区三区| 欧美成人精品三级在线观看| 国产精品旅馆在线| 亚洲国产精品va在看黑人| 爱福利视频一区| 综合网中文字幕| 亚洲伊人久久大香线蕉av| 日韩大片在线观看视频| 国产在线98福利播放视频| 精品亚洲一区二区三区在线播放| 久久久久久久久久婷婷| 国产亚洲激情视频在线| 久久999免费视频| 日韩欧美一区二区三区| 欧日韩不卡在线视频| 亚洲视频在线免费看| 欧美亚洲国产成人精品| 欧美日韩国产综合新一区| 日韩av一区在线观看| 欧美日韩一区二区免费视频| 黑人巨大精品欧美一区二区免费| 久久6精品影院| 国产精品福利在线观看| 欧美一级视频一区二区| 精品亚洲一区二区三区四区五区| 国产亚洲精品激情久久| 欧美日韩国产黄| 狠狠躁夜夜躁人人爽天天天天97| 一区二区三区视频免费在线观看| 久久久国产精彩视频美女艺术照福利| 亚洲第一区在线| 亚洲精品xxx| 国外成人免费在线播放| 中文字幕一精品亚洲无线一区| 欧美黄色性视频| 51精品在线观看| 91精品国产综合久久香蕉的用户体验| 欧美成人精品不卡视频在线观看| 欧美日韩美女在线观看| 91高清视频免费观看| 91麻豆国产语对白在线观看| 成人在线视频网| 亚洲免费av片| 欧美大片在线看免费观看| 久久精品视频99| 亚洲国产欧美一区| 国产精品黄页免费高清在线观看| 亚洲欧洲激情在线| 日韩电影在线观看免费| 九九热99久久久国产盗摄| 亚洲一区二区久久| 国产主播喷水一区二区| xx视频.9999.com| 国产黑人绿帽在线第一区| 国产精品久久久久久久久久久不卡| 欧美精品免费看| 欧美日韩亚洲天堂| 成人午夜在线影院| 97国产在线观看| 欧美午夜女人视频在线| 韩国19禁主播vip福利视频| 91经典在线视频| 亚洲国产欧美久久| 欧美日韩中文字幕日韩欧美| www.亚洲免费视频| 一本一道久久a久久精品逆3p| 92国产精品久久久久首页| 日韩国产在线播放| 国产精品丝袜久久久久久高清| 亚洲美女av在线| 中文字幕精品一区二区精品| 欧美国产高跟鞋裸体秀xxxhd|