運算子過載

2021-09-29 07:58:12 字數 3949 閱讀 7538

不能過載的運算子有:. 和 :: 和 ?:和.*和sizeof

注意點1:

使用運算子過載的本質上是一次函式呼叫,所以這些關於運算物件的求值順序無法應用到過載的運算子上。

友元函式和成員函式的使用場合:

一般情況下,建議一元運算子使用成員函式,二元運算子使用友元函式

1、運算子的操作需要修改類物件的狀態,則使用成員函式。如需要做左值運算元的運算子(如 =,+=,++)

2、運算時,有數和物件的混合運算時,必須使用友元

3、二元運算子中,第乙個運算元為非物件時,必須使用友元函式。如輸入輸出運算子 << 和 >>

4、當乙個過載運算子是成員函式時,this 繫結到左側運算物件。成員運算子函式的顯式形參比運算物件的數量少乙個

5、可以直接呼叫乙個過載的運算子函式,如 operator+(data1, data2), data1.operator(data2)

6、當運算子作用於內建型別物件時,我們無法改變運算子的含義

如下運算子

建議使用

所有一元運算子

成員函式

= ( ) [ ] ->

必須是成員函式

+= -= /= *= ^= &= != %= >>= <<= , 似乎帶等號的都在這裡了.

成員函式

所有其它二元運算子, 例如: –,+,*,/

友元函式

<< >>

必須是友元函式

注意點2當引數不會被改變,一般按 const 引用來傳遞(若是使用成員函式過載,函式也為 const).對於返回數值的決定:

1) 如果返回值可能出現在 = 號左邊, 則只能作為左值, 返回非 const 引用。

2) 如果返回值只能出現在 = 號右邊, 則只需作為右值, 返回 const 型引用或者 const 型值。

3) 如果返回值既可能出現在 = 號左邊或者右邊, 則其返回值須作為左值, 返回非 const 引用。

也就是左值為非const,右值const

過載 -> 運算子:

#include

using

namespace std;

struct node

node

(string *s)

:ptr

(s)node()

=default

;private

: string* ptr;};

//string* operator->(const node&x)

intmain()

-> 操作符只能通過成員函式來過載,不能通過友元函式來過載。如果通過友元函式來過載,會報錯

->操作符的返回根據型別不同,(返回值 function)的解釋也不同。

如果返回型別值內建指標,那麼就相當於 解引用一下((*返回值).function );

如果返回型別是類的時候,那麼就相當於ptr.operator->()->function。

過載–和++運算子:

#include

//成員函式

using

namespace std;

class

node

~node()

node&

operator--(

)const node&

operator--(

int)};

void

print

(ostream& os,

const node&it)

intmain()

#include

//友元

using

namespace std;

class

node

;node&

operator

--(node&it)

const node operator

--(node&it,

int)

void

print

(ostream & os,

const node&x)

intmain()

注意

需要用乙個佔位符(虛引數)區分前字尾運算

後置時不要返回引用,不然會返回乙個區域性物件引用

過載運算子:

#include

using

namespace std;

class

node

node()

=default

;node

(int

*a)int

operator

(int in)

}private

:int x[

100];}

;int

main()

//【】的過載必須是非靜態成員過載

我們可以發現 只能作為成員函式過載,如果過載為友元函式的話會報錯:

過載()運算子

我們可以發現 () 只能作為非靜態成員函式過載,如果過載為友元函式的話會報錯:

#include

using

namespace std;

class

node

node

(int a):x

(a)const

intoperator()

(const node &it)

const};

intmain()

過載運算子 () 的目的:物件 () 類似於函式名 (x),更加符合習慣

語法:過載方式:只能使用成員函式過載

過載後還可以繼續過載

函式名:operator( )(參數列)

參數列:引數隨意,具體根據實際情況而定。

函式呼叫:顯式呼叫:obj(x)

隱式呼叫:obj.operator( )(x)

返回型別:

1、返回成員的實際型別隨意,具體由程式設計師根據函式體定義

2、因為返回值只能做右值,唯讀,應該使用返回值為const型別

過載》《運算子

#include

using

namespace std;

class

gelgel

(int a)

:gel

(a,0

)gel

(void):

gel(0,

0)~gel()

};// ostream& operator<<(const gel &it, ostream &os)

ostream&

operator

<<

(ostream &os,

const gel &it)

intmain

(void

)

#include

using

namespace std;

class

gelgel

(int a)

:gel

(a,0

)gel

(void):

gel(0,

0)~gel()

ostream&

operator

<<

(ostream &os)};

intmain

(void

)

過載 = 運算子:

= 只能作為成員函式過載,如果過載為友元函式的話會報錯:

自己打過acm,感覺這個東西沒什麼總結的,

詳細總結在這裡:

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

運算子過載

c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...