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

2021-10-05 23:18:52 字數 2235 閱讀 8341

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char * 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子「=」。

注意:賦值運算子「=」只能過載為成員函式

賦值運算子過載例項示例:

#include

#include

using

namespace std;

class

string

const

char

*c_str()

; string &

operator=(

const

char

* s)

;//過載賦值運算子

~string()

//string類的析構函式 };

string & string::

operator=(

const

char

* s)

intmain()

/*輸出結果:

good luck,

shenzhou 8!

*/

string s1, s2;

//s1,s2為string類的物件。

s1 = 「this」;

//已經定義了 這種賦值的過載(如上面的程式)

s2 = 「that」;

s1 = s2;

//將呼叫string類的預設複製建構函式。

淺拷貝:

導致「指標懸掛「問題

如果我們沒有兩個物件間,定義賦值運算子的過載,執行s1=s2;會導致許多隱藏的問題。(淺拷貝)

下面是我們的執行過程(沒有定義賦值運算子);

1:對兩個物件進行

2:執行s1 = s2後。

注:如不定義自己的賦值運算子,那麼s1=s2實際上導致 s1.str和 s2.str指向同一地方。

導致問題:

解決方法:在class string裡新增成員函式:。

深拷貝:

為了解決淺拷貝出現的錯誤,必須顯式地定義乙個自己的賦值運算子,使之不但賦值資料成員,而且為物件 p1 和 p2 分配了各自的記憶體空間,這就是深拷貝。

string &

operator=(

const string & s)

修改示例:

#include

#include

using

namespace std;

class

string

const

char

*c_str()

; string &

operator=(

const

char

* s)

~string()

string &

operator=(

const string & s)};

intmain()

/*輸出結果:

this

that

that

that

*/

void 好不好?string 好不好? 為什麼是 string &

1:對運算子進行過載的時候,好的風格是應該盡量保留運算子原本的特性

string &

operator=(

const

char

* s)

補充:string類編寫複製建構函式的時候,會面臨和 = 同樣的問題,用同樣的方法處理。

某些時候會自動呼叫複製建構函式會產生一些臨時物件,這些物件在析構函式中被釋放時會空間,那麼就可能導致指標懸掛問題。解決方法:重寫複製建構函式

string

( string & s)

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

下面介紹類的賦值運算子 1.c 中物件的記憶體分配方式 在c 中,物件的例項在編譯的時候,就需要為其分配記憶體大小,因此,系統都是在stack上為其分配記憶體的。這一點和c 完全不同!千 萬記住 在c 中,所有類都是reference type,要建立類的實體,必須通過new在heap上為其分配空間...

C 運算子過載賦值運算子

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

過載賦值運算子

1 注意過載賦值運算子和,運算子必須定義為類的成員函式。2 注意 如果程式不提供顯示的賦值運算子則系統會提供乙個預設的賦值運算子。3 什麼時候過載賦值運算子 當類中含有指標成員時,一般都要重定義類的賦值運算子。4 過載賦值運算子時應有處理語句m m的情況。其中m是某乙個類的物件。如果不處理這樣的語句...