operator是C++的關(guān)鍵字,它和運(yùn)算符一起使用,,表示一個(gè)運(yùn)算符函數(shù),,理解時(shí)應(yīng)將operator=整體上視為一個(gè)函數(shù)名。 這是C++擴(kuò)展運(yùn)算符功能的方法,,雖然樣子古怪,但也可以理解:一方面要使運(yùn)算符的使用方法與其原來(lái)一致,,另一方面擴(kuò)展其功能只能通過(guò)函數(shù)的方式(c++中,,“功能”都是由函數(shù)實(shí)現(xiàn)的)。
一,、為什么使用操作符重載,?
二、如何聲明一個(gè)重載的操作符,? if (this->age==ps.age) person p1(10); B:操作符重載實(shí)現(xiàn)為非類(lèi)成員函數(shù)(全局函數(shù)) //滿(mǎn)足要求,做操作數(shù)的類(lèi)型被顯示指定
C:如何決定把一個(gè)操作符重載為類(lèi)成員函數(shù)還是全局名字空間的成員呢,?
(1) 只有C++預(yù)定義的操作符集中的操作符才可以被重載,; (2)對(duì)于內(nèi)置類(lèi)型的操作符,,它的預(yù)定義不能被改變,,應(yīng)不能為內(nèi)置類(lèi)型重載操作符,如,,不能改變int型的操作符+的含義,; (3) 也不能為內(nèi)置的數(shù)據(jù)類(lèi)型定義其它的操作符; (4) 只能重載類(lèi)類(lèi)型或枚舉類(lèi)型的操作符,; (5) 重載操作符不能改變它們的操作符優(yōu)先級(jí),; (6) 重載操作符不能改變操作數(shù)的個(gè)數(shù); (7) 除了對(duì)( )操作符外,,對(duì)其他重載操作符提供缺省實(shí)參都是非法的,;
E: 注意點(diǎn) (2) +號(hào)等這樣的操作符沒(méi)有對(duì)象可以容納改變后值,,對(duì)于這樣的情況最好返回?cái)?shù)值,,否則只能要操作符體內(nèi)創(chuàng)建臨時(shí)對(duì)象用于容納改變后的值,如果在堆中創(chuàng)建臨時(shí)對(duì)象返回指針或者引用,,在操作符函數(shù)體外還需要釋放它,,如果返回的對(duì)象而不是引用或者指針,那么效率是比較低的,。如果返回的是數(shù)值,,最好在該類(lèi)的構(gòu)造函數(shù)中增加對(duì)該類(lèi)型數(shù)值的轉(zhuǎn)換函數(shù),如:返回值是int類(lèi)型,,那么最好有一個(gè)int類(lèi)型作為參數(shù)的構(gòu)造函數(shù)。 (3)在增量運(yùn)算符中,,放上一個(gè)整數(shù)形參,,就是后增量運(yùn)行符,它是值返回,,對(duì)于前增量沒(méi)有形參,,而且是引用返回,示例: 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)前對(duì)象 } Test Test::operator ++(int) { Test tmp(*this); //創(chuàng)建臨時(shí)對(duì)象 m_value ++; //再增量 return temp; //返回臨時(shí)對(duì)象 } (4)因?yàn)閺?qiáng)制轉(zhuǎn)換是針對(duì)基本數(shù)據(jù)類(lèi)型的,,所以對(duì)類(lèi)類(lèi)型的轉(zhuǎn)換需自定義,; (5) 轉(zhuǎn)換運(yùn)行符重載聲明形式:operator 類(lèi)型名();它沒(méi)有返回類(lèi)型,因?yàn)轭?lèi)型名就代表了它的返回類(lèi)型,,所以返回類(lèi)型顯得多余,。 (6)一般來(lái)說(shuō),轉(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(),。這樣就不必提供對(duì)象參數(shù)重載運(yùn)算符了,如Test a1(1);Test a2(2); Test a3; a3 = a1+a2,;就不需要重載+號(hào)操作符了,,因?yàn)閷?duì)于a1+a2的運(yùn)算,系統(tǒng)可能會(huì)先找有沒(méi)有定義針對(duì)Test的+號(hào)操作符,,如果沒(méi)有,,它就會(huì)找有沒(méi)有針對(duì)Test類(lèi)轉(zhuǎn)換函數(shù)參數(shù)類(lèi)型的+號(hào)操作符(因?yàn)榭梢詫?號(hào)運(yùn)行結(jié)果的類(lèi)型通過(guò)轉(zhuǎn)換函數(shù)轉(zhuǎn)換為T(mén)est對(duì)象),因?yàn)門(mén)est類(lèi)有個(gè)int類(lèi)型的參數(shù),,對(duì)于int類(lèi)型有+操作符,,所以a1+a2真正執(zhí)行的是Test(int(a1) + int(a2));即Test(3); (7)對(duì)于轉(zhuǎn)換運(yùn)算符,,還有一個(gè)需要注意的地方就是,,如果A類(lèi)中有以B為參數(shù)的轉(zhuǎn)換函數(shù)(構(gòu)造函數(shù)),那B中不能有A的轉(zhuǎn)換運(yùn)算符,,不然就存在轉(zhuǎn)換的二義性,,如: class A{A(B&){…}}; class B{ operator A(){…}};那么以下語(yǔ)句就會(huì)有問(wèn)題: B b; A(b);//A(b)有就可能是A的構(gòu)造函數(shù),也可以是B的轉(zhuǎn)換運(yùn)算符 |
|
來(lái)自: 閱讀擴(kuò)展視野 > 《待分類(lèi)》