類與物件 C 過載運算子

2021-10-05 12:05:24 字數 3827 閱讀 7991

class

person

呼叫形式

person p3 = p1.operator+(p2);

或者 p3 = p1 + p2;*/}

;person operator

+(person &p1,person &p2)

intmain()

一般情況下,我們把算術運算子定義成非成員函式,因為我們不需要改變運算物件的狀態,所以形參都是常量的引用。

過載輸出運算子函式不能是成員函式,因為不能實現《在左邊。 例如 p《通常情況下,輸出運算子的第乙個形參是乙個非常量ostream物件的引用。它是非常量是因為向流寫入內容會改變其狀態;而該物件是引用是因為我們不能直接複製乙個ostream物件。第二個形參一般是乙個常量(想列印的類型別)的引用。是引用的原因是為了避免複製實參;而之所以形參可以是常量是因為列印內容一般不會改變物件的內容。

operator《返回型別一般要返回它的ostream引用(如果返回型別是void的話,cout<

#include

using

namespace std;

class

person

friend ostream &

operator

<<

(ostream &os,

const person &p)

;private

:int mem_a;

int mem_b;};

ostream &

operator

<<

(ostream &os,

const person &p)

intmain()

一般輸出運算子與友元搭配可實現自定義資料型別。

輸出運算子應該主要負責列印物件的內容而非控制格式,輸出運算子不應該列印換行符。

#include

using

namespace std;

class

myclock

friend ostream &

operator

<<

(ostream &os,

const myclock &c)

; myclock&

operator++(

);myclock operator++(

int)

; myclock&

operator--(

);myclock operator--(

int)

;private

:int second;};

myclock& myclock::

operator++(

)//為了跟內建版本保持一致,前置運算子應該返回遞增或遞減後物件的引用。

myclock myclock::

operator++(

int)

myclock& myclock::

operator--(

)//為了跟內建版本保持一致,前置運算子應該返回遞增或遞減後物件的引用。

myclock myclock::

operator--(

int)

//為了跟內建版本保持一致,前置運算子應該返回遞增或遞減後物件的引用。

ostream &

operator

<<

(ostream &os,

const myclock &c)

intmain()

最好將遞增遞減運算子設定為成員函式,因為它們改變的正好是所操作物件的狀態。

在引數列表裡使用int這一佔位引數來區分前置、後置遞增遞減運算子。

為了與內建版本保持一致,後置運算子應該返回物件的原值(遞增或遞減之前的值),返回的是值而不是引用(不能返回區域性變數的引用。)

myclock c;

c.operator++(

0);//呼叫後置版本的operator++;

c.operator--(

);//呼叫前置版本的operator++;

我們可以過載賦值運算子。不論形參的型別是什麼,賦值運算子都必須定義成員函式,並且返回左側運算物件的引用。

當類包含有指標資料成員時,合成賦值運算子函式常會引發「指標懸掛」問題。

#include

#include

using

namespace std;

class

string

~string()

void

print()

string&

operator=(

const string& s);}

;string& string::

operator=(

const string& s)

intmain()

//l6

cout <<

"p1:"

;//l7

p1.print()

;//l8

}

//復合賦值運算子也應該返回左側運算物件的引用,最好是成員函式

person&

operator+=

(const person &p2)

//在如下給定的**中,為 mycircle 類新增關係運算子 >、<、>=、<=、==、!= ,實現按照半徑對 mycircle 物件進行比較。

//類內宣告

bool

operator

>

(const mycircle &m1)

;bool

operator

<

(const mycircle &m1 )

;bool

operator

>=

(const mycircle &m1)

;bool

operator

<=

(const mycircle &m1)

;bool

operator==(

const mycircle &m1)

;bool

operator!=(

const mycircle &m1)

;bool mycircle::

operator

>

(const mycircle &m1)

bool mycircle::

operator

<

(const mycircle &m1)

bool mycircle::

operator

>=

(const mycircle &m1)

bool mycircle::

operator

<=

(const mycircle &m1)

bool mycircle::

operator==(

const mycircle &m1)

bool mycircle::

operator!=(

const mycircle &m1)

intmain()

/* 輸出:01

1001

*/

C 過載運算子

運算子過載是一種形式的c 多型。在c 中,編譯器有能力把乙個由資料 物件和操作符共同組成的表示式,解釋為對乙個全域性或成員函式的呼叫。該全域性或成員函式被稱為操作符函式,通過重定義操作符函式,可以實現針對自定義型別 結構,類 的運算法則,並使之與內建型別一樣參與各種表示式。過載運算子可使 看起來更加...

C 過載運算子

本文主要講述加號運算子 自增運算子 流提取運算子運 流插入運算子 先給出vector類 class vector 建構函式 vector const vector v 拷貝建構函式 vector operator const vector v 過載 vector operator 過載前置自增運算子...

C 過載運算子

過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。如果我們定義的函式為類的成員函式 box operator const box 如果我們定義的函式為非成員函式,那麼我們需要為每次操作傳遞兩個...