新聞中心
operator關(guān)鍵字怎么在C++項(xiàng)目中使用?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
operator是C++的關(guān)鍵字,它和運(yùn)算符一起使用,表示一個(gè)運(yùn)算符函數(shù),理解時(shí)應(yīng)將operator=整體上視為一個(gè)函數(shù)名。
這是C++擴(kuò)展運(yùn)算符功能的方法,雖然樣子古怪,但也可以理解:一方面要使運(yùn)算符的使用方法與其原來一致,另一方面擴(kuò)展其功能只能通過函數(shù)的方式(c++中,“功能”都是由函數(shù)實(shí)現(xiàn)的)。
一、為什么使用操作符重載?
對于系統(tǒng)的所有操作符,一般情況下,只支持基本數(shù)據(jù)類型和標(biāo)準(zhǔn)庫中提供的class,對于用戶自己定義的class,如果想支持基本操作,比如比較大小,判斷是否相等,等等,則需要用戶自己來定義關(guān)于這個(gè)操作符的具體實(shí)現(xiàn)。比如,判斷兩個(gè)人是否一樣大,我們默認(rèn)的規(guī)則是按照其年齡來比較,所以,在設(shè)計(jì)person 這個(gè)class的時(shí)候,我們需要考慮操作符==,而且,根據(jù)剛才的分析,比較的依據(jù)應(yīng)該是age。那么為什么叫重載呢?這是因?yàn)椋诰幾g器實(shí)現(xiàn)的時(shí)候,已經(jīng)為我們提供了這個(gè)操作符的基本數(shù)據(jù)類型實(shí)現(xiàn)版本,但是現(xiàn)在他的操作數(shù)變成了用戶定義的數(shù)據(jù)類型class,所以,需要用戶自己來提供該參數(shù)版本的實(shí)現(xiàn)。
二、如何聲明一個(gè)重載的操作符?
A: 操作符重載實(shí)現(xiàn)為類成員函數(shù)
重載的操作符在類體中被聲明,聲明方式如同普通成員函數(shù)一樣,只不過他的名字包含關(guān)鍵字operator,以及緊跟其后的一個(gè)c++預(yù)定義的操作符。
可以用如下的方式來聲明一個(gè)預(yù)定義的==操作符:
class person{ private: int age; public: person(int a){ this->age=a; } inline bool operator == (const person &ps) const; };
實(shí)現(xiàn)方式如下:
inline bool person::operator==(const person &ps) const { if (this->age==ps.age) return true; return false; }
調(diào)用方式如下:
#include using namespace std; int main() { person p1(10); person p2(20); if(p1==p2) cout<<”the age is equal!”< return 0; }
這里,因?yàn)閛perator ==是class person的一個(gè)成員函數(shù),所以對象p1,p2都可以調(diào)用該函數(shù),上面的if語句中,相當(dāng)于p1調(diào)用函數(shù)==,把p2作為該函數(shù)的一個(gè)參數(shù)傳遞給該函數(shù),從而實(shí)現(xiàn)了兩個(gè)對象的比較。
B:操作符重載實(shí)現(xiàn)為非類成員函數(shù)(全局函數(shù))
對于全局重載操作符,代表左操作數(shù)的參數(shù)必須被顯式指定。例如:
#include #include using namespace std; class person { public: int age; public: }; bool operator==(person const &p1 ,person const & p2) //滿足要求,做操作數(shù)的類型被顯示指定 { 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:如何決定把一個(gè)操作符重載為類成員函數(shù)還是全局名字空間的成員呢?
①如果一個(gè)重載操作符是類成員,那么只有當(dāng)與他一起使用的左操作數(shù)是該類的對象時(shí),該操作符才會(huì)被調(diào)用。如果該操作符的左操作數(shù)必須是其他的類型,則操作符必須被重載為全局名字空間的成員。
②C++要求賦值=,下標(biāo)[],調(diào)用(), 和成員指向-> 操作符必須被定義為類成員操作符。任何把這些操作符定義為名字空間成員的定義都會(huì)被標(biāo)記為編譯時(shí)刻錯(cuò)誤。
③如果有一個(gè)操作數(shù)是類類型如string類的情形那么對于對稱操作符比如等于操作符最好定義為全局名字空間成員。
D:重載操作符具有以下限制:
(1)只有C++預(yù)定義的操作符集中的操作符才可以被重載;
(2)對于內(nèi)置類型的操作符,它的預(yù)定義不能被改變,應(yīng)不能為內(nèi)置類型重載操作符,如,不能改變int型的操作符+的含義;
(3) 也不能為內(nèi)置的數(shù)據(jù)類型定義其它的操作符;
(4) 只能重載類類型或枚舉類型的操作符;
(5) 重載操作符不能改變它們的操作符優(yōu)先級(jí);
(6) 重載操作符不能改變操作數(shù)的個(gè)數(shù);
(7) 除了對( )操作符外,對其他重載操作符提供缺省實(shí)參都是非法的;
E: 注意點(diǎn)
(1)后果載操操作符首先要確定它的返回值是左值,還是右值,如果是左值最返回引用,如果是右值那就直接返回值;
(2) +號(hào)等這樣的操作符沒有對象可以容納改變后值,對于這樣的情況最好返回?cái)?shù)值,否則只能要操作符體內(nèi)創(chuàng)建臨時(shí)對象用于容納改變后的值,如果在堆中創(chuàng)建臨時(shí)對象返回指針或者引用,在操作符函數(shù)體外還需要釋放它,如果返回的對象而不是引用或者指針,那么效率是比較低的。如果返回的是數(shù)值,最好在該類的構(gòu)造函數(shù)中增加對該類型數(shù)值的轉(zhuǎn)換函數(shù),如:返回值是int類型,那么最好有一個(gè)int類型作為參數(shù)的構(gòu)造函數(shù)。
(3)在增量運(yùn)算符中,放上一個(gè)整數(shù)形參,就是后增量運(yùn)行符,它是值返回,對于前增量沒有形參,而且是引用返回,示例:
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; //返回當(dāng)前對象 } Test Test::operator ++(int) { Test tmp(*this); //創(chuàng)建臨時(shí)對象 m_value ++; //再增量 return temp; //返回臨時(shí)對象 }
(4)因?yàn)閺?qiáng)制轉(zhuǎn)換是針對基本數(shù)據(jù)類型的,所以對類類型的轉(zhuǎn)換需自定義;
(5) 轉(zhuǎn)換運(yùn)行符重載聲明形式:operator 類型名();它沒有返回類型,因?yàn)轭愋兔痛砹怂姆祷仡愋停苑祷仡愋惋@得多余。
(6)一般來說,轉(zhuǎn)換運(yùn)算符與轉(zhuǎn)換構(gòu)造函數(shù)(即帶一個(gè)參數(shù)的構(gòu)造函數(shù))是互逆的,如有了構(gòu)造函數(shù)Test(int),那么最好有一個(gè)轉(zhuǎn)換運(yùn)算符int()。這樣就不必提供對象參數(shù)重載運(yùn)算符了,如Test a1(1);Test a2(2); Test a3; a3 = a1+a2;就不需要重載+號(hào)操作符了,因?yàn)閷τ赼1+a2的運(yùn)算,系統(tǒng)可能會(huì)先找有沒有定義針對Test的+號(hào)操作符,如果沒有,它就會(huì)找有沒有針對Test類轉(zhuǎn)換函數(shù)參數(shù)類型的+號(hào)操作符(因?yàn)榭梢詫?號(hào)運(yùn)行結(jié)果的類型通過轉(zhuǎn)換函數(shù)轉(zhuǎn)換為Test對象),因?yàn)門est類有個(gè)int類型的參數(shù),對于int類型有+操作符,所以a1+a2真正執(zhí)行的是Test(int(a1) + int(a2));即Test(3);
(7)對于轉(zhuǎn)換運(yùn)算符,還有一個(gè)需要注意的地方就是,如果A類中有以B為參數(shù)的轉(zhuǎn)換函數(shù)(構(gòu)造函數(shù)),那B中不能有A的轉(zhuǎn)換運(yùn)算符,不然就存在轉(zhuǎn)換的二義性,如:
class A{A(B&){…}}; class B{ operator A(){…}};
那么以下語句就會(huì)有問題:
B b; A(b);//A(b)有就可能是A的構(gòu)造函數(shù),也可以是B的轉(zhuǎn)換運(yùn)算符
看完上述內(nèi)容,你們掌握operator關(guān)鍵字怎么在C++項(xiàng)目中使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章題目:operator關(guān)鍵字怎么在C++項(xiàng)目中使用-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://www.ef60e0e.cn/article/ddjjsd.html