(GeekBand)C++面向對象高級編程(上)第一周筆記(2)

第五節 操作符重載與臨時對象

今天來分析一下操作符重載。

操作符的重載根據是否為類成員函數分為兩種,在分析時會涉及到一個新的知識點:臨時對象(temp object),語法是typename(),有效域為一行。

我們來看一下第一種操作符重載,在類中進行重載(+=)。

#include<iostream>
using namespace std;

class complex
{
private:
    double re,im;
    friend complex& _doapl(complex*,const complex&);//為重載時需要調用的函數開一個后門
public:
    complex(double r=0,double i=0):re(r),im(i)//構造函數,對re,im進行初始化
    {}
    complex& operator +=(const complex&);//重載函數
    double real() const{return re;}//get re
    double image() const{return im;}//get im
};

inline complex& //申請內聯函數(與編譯器相關)
complex::operator +=(const complex& r)//傳入右值
{
    return _doapl(this,r);//調用_doapl(do assignment plus),this指向c2
}

inline complex&//返回*ths的引用
_doapl(complex* ths,const complex& r)//+=新算法(重載實現)
{
    ths->re+=r.re;
    ths->im+=r.im;
    return *ths;  //返回ths指針指向的變量,即c2
}

int main()
{
    complex c1(2,1);
    complex c2(5);
    c2+=c1;
    cout<<"("<<c2.real()<<","<<c2.image()<<")"<<endl;//打印結果
    return 0;
}


附一張運行結果:

下面來看第二種操作符重載,在類外進行重載(+,無this)。

根據不同類型的加法運算多次重載'+'運算符。

#include<iostream>
using namespace std;

class complex
{
private:
    double re,im;
public:
    complex(double r=0,double i=0):re(r),im(i)
    {}
    double real() const{return re;}//get re
    double image() const{return im;}//get im
};

inline complex//因為返回臨時object所以用value而不是reference
operator + (const complex& x,const complex& y)
{
    return complex(x.real()+y.real(),x.image()+y.image());
}//對應c2=c1+c2

inline complex
operator + (const complex& x,double y)
{
    return complex(x.real()+y,x.image());
}//對應c2=c1+5

inline complex
operator + (double x ,const complex& y)
{
    return complex(x+y.real(),y.image());   
}//對應c2=7+c1

int main()
{
    complex c1(2,1);
    complex c2(5);
    c2=c1+c2;
    //c2=c1+5;
    //c2=7+c1;
    cout<<"("<<c2.real()<<","<<c2.image()<<")"<<endl;
    return 0;
}


附上一張運行結果:

在眾多操作符中,有一種比較特殊,就是'<<'。在對'<<'操作符進行重載時,只能通過

第二種方法,即在全局下重載,下面我們來看一下它的實現。

#include<iostream>
using namespace std;

class complex
{
private:
    double re,im;
public:
    complex(double r=0,double i=0):re(r),im(i)
    {}
    double real() const{return re;}
    double image() const{return im;}
};

inline ostream&
operator <<(ostream& os,const complex& r)
{
    return os<<'('<<r.real()<<','<<r.image()<<')';
}

int main()
{
    complex c1(2,1);
    cout<<c1<<endl;
    return 0;
}


這里簡單的對操作符'<<'進行了重載,使其可是輸入復數。那么請思考一下,既然在operator <<(ostream& os,const complex& r)函數我們已經更改了os,為什么還要return呢?

下面我們對代碼稍作更改。

#include<iostream>
using namespace std;

class complex
{
private:
    double re,im;
public:
    complex(double r=0,double i=0):re(r),im(i)
    {}
    double real() const{return re;}
    double image() const{return im;}
};

void operator <<(ostream& os,const complex& r)//將返回類型更改為void
{
    os<<'('<<r.real()<<','<<r.image()<<')';//去掉了return
}

int main()
{
    complex c1(2,1);
    cout<<c1;//輸出c1
    return 0;
}

運行結果:



既然結果相同,為什么不使用更易理解、使用沒有返回值的方法呢?其實不然,這種方法有它的弊端,比如我們將主函數中的cout<<c1換成cout<<c1<<endl,那么在編譯時就會報錯。原因是操作符'<<'將左值cout與右值c1傳入重載函數后會返回void類型,這時表達式變成了void()<<endl,操作符'<<'的左值應該是ostream類型而非void類型,所以會報錯。為了適應我們一貫的書寫習慣,建議使用返回ostream類型的方法。

今天就到這吧,內容有點多,還有待消化。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容