久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C++ operator關(guān)鍵字(重載操作符)

 閱讀擴(kuò)展視野 2017-08-08

   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)的)。

 

 一,、為什么使用操作符重載,?
對(duì)于系統(tǒng)的所有操作符,一般情況下,,只支持基本數(shù)據(jù)類(lèi)型和標(biāo)準(zhǔn)庫(kù)中提供的class,,對(duì)于用戶(hù)自己定義的class,如果想支持基本操作,,比如比較大小,,判斷是否相等,等等,,則需要用戶(hù)自己來(lái)定義關(guān)于這個(gè)操作符的具體實(shí)現(xiàn),。比如,判斷兩個(gè)人是否一樣大,,我們默認(rèn)的規(guī)則是按照其年齡來(lái)比較,,所以,在設(shè)計(jì)person 這個(gè)class的時(shí)候,,我們需要考慮操作符==,,而且,根據(jù)剛才的分析,比較的依據(jù)應(yīng)該是age,。那么為什么叫重載呢,?這是因?yàn)椋诰幾g器實(shí)現(xiàn)的時(shí)候,,已經(jīng)為我們提供了這個(gè)操作符的基本數(shù)據(jù)類(lèi)型實(shí)現(xiàn)版本,,但是現(xiàn)在他的操作數(shù)變成了用戶(hù)定義的數(shù)據(jù)類(lèi)型class,所以,,需要用戶(hù)自己來(lái)提供該參數(shù)版本的實(shí)現(xiàn),。

 

二、如何聲明一個(gè)重載的操作符,?
A:  操作符重載實(shí)現(xiàn)為類(lèi)成員函數(shù)
重載的操作符在類(lèi)體中被聲明,,聲明方式如同普通成員函數(shù)一樣,只不過(guò)他的名字包含關(guān)鍵字operator,,以及緊跟其后的一個(gè)c++預(yù)定義的操作符,。
可以用如下的方式來(lái)聲明一個(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ù),,所以對(duì)象p1,p2都可以調(diào)用該函數(shù),,上面的if語(yǔ)句中,相當(dāng)于p1調(diào)用函數(shù)==,,把p2作為該函數(shù)的一個(gè)參數(shù)傳遞給該函數(shù),,從而實(shí)現(xiàn)了兩個(gè)對(duì)象的比較。

B:操作符重載實(shí)現(xiàn)為非類(lèi)成員函數(shù)(全局函數(shù))
對(duì)于全局重載操作符,,代表左操作數(shù)的參數(shù)必須被顯式指定,。例如:
#include
#include
using namespace std;
class person
{
public:
int age;
public:
};

bool operator==(person const &p1 ,person const & p2)

//滿(mǎn)足要求,做操作數(shù)的類(lèi)型被顯示指定
{
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è)操作符重載為類(lèi)成員函數(shù)還是全局名字空間的成員呢,?
①如果一個(gè)重載操作符是類(lèi)成員,,那么只有當(dāng)與他一起使用的左操作數(shù)是該類(lèi)的對(duì)象時(shí),該操作符才會(huì)被調(diào)用,。如果該操作符的左操作數(shù)必須是其他的類(lèi)型,,則操作符必須被重載為全局名字空間的成員。
②C++要求賦值=,,下標(biāo)[],,調(diào)用(), 和成員指向-> 操作符必須被定義為類(lèi)成員操作符,。任何把這些操作符定義為名字空間成員的定義都會(huì)被標(biāo)記為編譯時(shí)刻錯(cuò)誤,。
③如果有一個(gè)操作數(shù)是類(lèi)類(lèi)型如string類(lèi)的情形那么對(duì)于對(duì)稱(chēng)操作符比如等于操作符最好定義為全局名字空間成員。

 


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

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

(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)算符

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多