過載賦值運算子

2021-09-29 23:04:18 字數 2553 閱讀 1078

1、為什麼要過載賦值運算子?

預定義的賦值運算子"="要求左右兩邊的運算元型別是匹配的或者至少是相容的。有時希望賦值運算子兩邊的運算元即使型別不相容也能成立。此時可以通過過載賦值運算子來完成這種需求。

2、過載賦值運算子的特點

3、舉例

class

string

//無參建構函式

const

char

*c_str()

;//普通成員函式

string &

operator=(

const

char

* s)

;//過載賦值運算子的符號成員函式

string()

//析構成員函式};

//過載「=」以使得 obj = 「hello」能夠成立

string & string::

operator=(

const

char

* s)

intmain()

/*輸出:

good luck,

shenzhou 8!

*/

4、該例中存在的問題上述**中執行:

string s2 =

"hello!"

;

這條語句會發生錯誤,因為這裡的等號並不是賦值的意思,而是初始化的意思。那麼如何解決這種定義時初始化的問題呢?解決方案:可以定義乙個型別轉換建構函式:

string

(char

* s)

這樣,在這行這條語句時,執行的將會是型別轉換建構函式。

5、為什麼將賦值運算子函式的返回值寫成引用型別?

首先考慮可選的型別:

我們寫符號函式應該盡量符合符號原有的用法習慣。

(1)寫成void的帶來的問題:

a = b = c;
如果賦值運算子的返回型別為空,那麼執行該語句就會出現錯誤。首先,運算子過載並不改變運算子的優先順序和結合性,由於賦值運算子的右結合性,因此先執行b=c,此時能夠正確執行,但是執行的結果為void型別,將乙個空型別賦值給string型別的a物件,顯然會導致錯誤。但是按照我們原有的對賦值運算子的用法,它是可以被用來連等的。解決這個問題的方法是,將返回值型別設定為string,或者string&。

(2)寫成string帶來的問題:

(a=b)

=c;

解釋一:

此時由於括號「()」改變了結合順序,所以先執行a=b,結果是將b的值賦值給a,這裡沒有問題。但是,因為函式的返回值型別只有為引用時返回得到的才是左值,為其他型別時返回得到是右值。右值是不可以位於賦值運算子的左側的,因此該語句會導致結果異常。

解釋二:

此時由於括號「()」改變了結合順序,所以先執行a=b,結果是將b的值賦值給a,這裡沒有問題。該函式表示式呼叫賦值符號函式,返回乙個string型別的臨時變數。然後再次呼叫賦值符號函式,將c的值賦值給該臨時變數。因此,輸出a的話得到的結果仍是b的值。

這兩條解釋的區別在於,賦值符號函式返回的結果是左值,還是非左值。可以在編譯器上跑一下是哪種結果。此時可以把=看成是乙個函式,這個函式返回值是左值,那麼賦值符號返回的就是左值。這個函式返回值是右值,那麼賦值符號返回的就是右值。在《c++ primer》一書中提到,函式返回值只有為引用型別時,返回結果才是左值,而這裡顯然不是左值。所以按照這樣分析,應該是解釋一成立。

實際上,無論這兩條解釋的哪一條成立,導致的結果是:我們不想看到的效果。

6、實驗驗證上述解釋

#include

#include

using

namespace std;

class

string

//無參建構函式

const

char

*c_str()

const

;//普通成員函式

string operator=(

const

char

* s)

;//過載賦值運算子的符號成員函式

~string()

//析構成員函式};

//過載「=」以使得 obj = 「hello」能夠成立

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

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

過載賦值運算子

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

賦值運算子過載

在下面類中實現 class cmystring 為了寫出乙個完整的賦值運算子過載函式,我們要考慮以下幾個問題 一步步解決上述的問題,我們可以編寫出經典的演算法 cmystring cmystring operator const cmystring str return this 考慮到異常安全性的...