C 手稿 運算子過載

2021-07-04 16:16:57 字數 3302 閱讀 8337

運算子過載就是對已有的c++運算子賦予更多的語義,讓乙個運算子可以作用於其他的資料型別。 典型地,讓運算子接受乙個類的物件作為引數。通常有兩種方式來過載乙個運算子:

宣告乙個普通函式,作為類的友元。

宣告為類的成員方法。

事實上,運算子的本質是函式。每個運算子呼叫會轉換為函式呼叫,運算子的運算元轉換為函式引數。 運算子的過載本質上是方法的過載。

這些運算子不允許過載:..*::?:sizeof

過載為普通函式時,引數的個數為運算子的目數:

cperson

operator+(

const

cperson

&male

,const

cperson

&female

);cperson

male

("bob"

),female

("alice"

);cperson

child1

=male

+female

;// 等價於

cperson

child2

=operator+(

male

,female

);

這些運算子必須過載為成員函式:()->=

過載為成員函式時,引數的個數為運算子的目數-1:

class

cperson

cperson

operator+(

const

cperson

&female)};

cperson

male

("bob"

),female

("alice"

);cperson

child1

=male

+female

;// 等價於

cperson

child2

=male

.operator+(

female

);

接下來列舉一些常見的運算子過載實踐。當乙個物件賦值給另乙個物件的變數時,賦值運算子被呼叫。

const

cperson

&operator=(

const

cperson&p

);

對於賦值運算子,更高效的做法是「copy and swap」:

const

cperson

&operator=(

cperson

p);

事實上賦值運算子有兩點重要的關注:

自我賦值的正確性。一些失敗的實現中,會先deletethis的資源。

上述**中用std::swap保證了自我賦值的正確性。當然你也可以自己寫乙個健壯的swap函式。

異常安全。當拷貝失敗時,原有物件不可破壞。

上述**中,拷貝發生在進入函式之前,提供了強烈的異常安全。同時編譯器來完成拷貝比函式中手動拷貝更加高效。

ostream

&operator

<<

(ostream&o

,const

cperson&p

)

返回ostream&也是為了支援鏈式呼叫:`cout《事實上,operator<<(int)ostream的成員函式:

class

ostream

};

class

array

array

(array

&old)~

array

()int

&operator

(inti)

const

array

&operator=(

const

array

rhs)

};

自增、自減運算子分為前置運算子和後置運算子。雖然邏輯上都是一元的,但在定義過載方法時, c++規定:前置運算子有乙個引數,後置運算子有兩個引數。

當然第二個引數是沒用的,只是為了生成不同的函式簽名。

例如:

cperson

&operator++(

cperson&);

cperson

operator++(

cperson&,

int);

可以看到後置自加運算子的返回值為cperson,會在函式返回時生成乙個新的物件, 這是因為它的表示式值定義為自加之前的值。 因此,通常我們盡量使用前置的自加、自減運算子:

for

(vector

<

int>i=

v.begin

();i!=v

.end

();++

i);

基本資料型別到物件的轉換是靠過載建構函式來實現的; 物件到基本資料型別的轉換是靠過載強制轉換運算子來實現的:

class

cperson

operator

int()

};cpersonp;

(int)p

==p.int

();

下面的例子展示了上述兩種轉換何時被呼叫:

cpersonp1(

1);cout

<<

p1<<

endl

;// p1.int()

cout

<3<<

endl

;// cperson(3),p.int();p1=

3+p1;

// p1.int(),cperson(4)

C 運算子過載 過載特殊運算子

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...