運算子過載

2021-04-14 13:45:01 字數 2820 閱讀 4640

c++中的運算子

1。大多數系統預定義運算子都能過載

. :: ?: # *

?:不值得過載

#不能被過載

2過載不能改變優先順序

不能改變結合性

不能改變運算子所需運算元的個數

過載後,可按這些運算子的表達方式使用

運算子過載的語法

一、通過運算子過載函式進行過載

1。運算子過載函式是成員函式

語法形式:

type x::operator@(參數列)

void x::operator +(參數列)

2.運算子過載函式是友元函式

語法形式:

type operator@(參數列)

注意:過載中注意的問題

1、運算子過載函式是友元函式、成員函式的區別;

2、運算子被過載時,只是相對一特定類被過載,在特定的環境下作出特定的解釋。當離開這個特定環境後,具有原來的意義(系統定義);

3、當過載運算子解釋失敗時,用該運算子的預定義版本(系統)進行解釋;

4、用此方法過載時,只能對乙個系統已有運算子進行特定環境下的新的解釋,而不能創造新的運算子。當運算子不夠用時,用函式呼叫來實現;

5、除「=」以外,過載的運算子可以被任何派生類所繼承,「=」需要每個類明確定義自己的解釋;

6、 過載可能讓程式的可讀性下降,在使用時應模仿運算子的習慣用法 。

一元和二元運算子

一、運算子過載函式定義的兩種方式

1、成員函式和友元函式

2、差別的關鍵原因:this指標

二、一元運算子

1、不論字首還是字尾,需要乙個運算元

2、對於任意一元運算子α:

(1)成員函式過載運算子

定義          type x::operator α( )

顯式呼叫      objx.operator α( )

隱式呼叫      αobjx  或:ojbxα

(2)友元函式過載運算子

定義           type operator α(xobj)

顯式呼叫       operatorα(obj x)

隱式呼叫       αojbx  或:objx α

一元操作符

成員函式 運算元通過this指標隱含傳遞,因此參數列為空。

友元函式 所需要的乙個運算元在參數列中,由物件顯式地提供

二元操作符

成員函式 第乙個運算元通過this指標隱含傳遞,第二個運算元通過引數提供,只有乙個引數。

友元函式 所需要的兩個運算元在參數列中,由物件顯式地提供。

(1)成員函式過載運算子

定義   type x::operator β(x obj)

顯式呼叫      objx1.operator β(objx2)

隱式呼叫      objx1 β(objx2)

(2)友元函式過載運算子

定義 type operator β( x ojb)

顯式呼叫  operator β(objx1, objx2)

隱式呼叫  objx1 β(objx2)

成員函式過載運算子,啟用運算子的物件都是由this指標隱含傳遞的。

二、例項

class x

x operator ++(int x)

用友元函式過載運算子

class x

friend operator ++(y &a, int i)

1、成員函式過載可能造成的麻煩:成員函式過載的運算子不具有交換性。

原因:成員函式僅能被乙個「實際物件」所呼叫,如果引起成員函式呼叫的是乙個值(非乙個物件),成員函式將不能正確工作。

2、可用友元函式解決這一問題:

友元函式過載運算子時,需要明確給出引數,不會出錯。

3、不能用友元函式過載的運算子:

= 、 ( )、[]、- >

4、注意:

(1)對this所指向的資料的任何改變都會影響到啟用運算數函式的物件。

(2)可使用引用引數(指標)來解決過載時的二義性。

過載++和--

一、關於++和- -

1、c中的++和- -的兩種形式:

字首:++i; 字尾:i--;

2、在c++中的約定 (顯式地區分字首和字尾)

(1)對於字首方式++i:

成員函式:xx::operator ++ ();

友元函式:x operator ++ (x&);

(2)對於字尾方式i++:

成員函式:xx::operator ++ (int);

友元函式:x operator ++(x&, int);

第二個引數int一般設定為0,如:

i++  等價於:i++(0)  或:i++=0

過載賦值運算子

一、概述

1、「=」賦值運算子可以被過載;

2、過載後不能被繼承;

3、必須過載為成員函式。

二、格式:

x x :: operator=(const x from)

三、一般來說當預設的類賦值函式不能正確工作時,考慮「=」的過載。

過載運算子()和[]

一、過載函式呼叫運算子()

1、函式為:operator();

2、格式:

x x;

x(arg1, arg2)  可被解釋為:x. operator ()(arg1,arg2);

二、過載下標運算子[]

1、函式為:operator[];

2、格式:

x x;

x(y)  可被解釋為:x. operator [  ](y);

三、兩都者只能採用成員函式過載,不能使用友元函式。

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

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

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

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

運算子過載

eric gunnerson microsoft corporation 2001年6月21日 作為有關 c 語言規範漫談的繼續,本月我們將討論運算子過載的問題。運算子過載 除非特別指明,否則本專欄的其餘部分一律將其簡稱為 過載 是指允許使用者使用使用者定義的型別編寫表示式的能力。它允許使用者定義的...