陷阱重重的C 賦值過載函式operator

2021-08-04 07:36:28 字數 1756 閱讀 7137

曾經有c++高手說過:看乙個c++程式設計師功底是否夠硬,讓他寫個賦值過載函式就能看出來了!在我看來,這種說法並不誇張。因為能將operator=函式寫好確實需要紮實的基礎,其中的陷阱真不少。

先看**

[cpp]view plain

copy

print?

string& string::operator=(

const

string& rhs)    

此**就是沒有規避自我賦值,那麼如果進行以下的呼叫,那麼後果很嚴重。

[cpp]view plain

copy

print?

string mystr(

"abc"

);  

mystr = mystr;  

賦值操作中,會先把自己的資料delete掉,然後再strcpy乙個空值,程式立馬掛了。

所以,在賦值函式開始的時候,需要防止自我複製。寫法如下:

[cpp]view plain

copy

print?

string& string::operator=(

const

string& rhs)    

但有些書籍上面使用以下寫法,不敢苟同。

[cpp]view plain

copy

print?

string& string::operator=(

const

string& rhs)    

在初學者的群體當中,有出現諸如以下幾種返回值版本:

[cpp]view plain

copy

print?

// 版本一

string string::operator=(const

string& rhs)    

[cpp]view plain

copy

print?

// 版本二

const

string& string::operator=(

const

string& rhs)    

[cpp]view plain

copy

print?

// 版本三

string* string::operator=(const

string& rhs)    

版本一的缺陷:多了乙個臨時物件的生成和拷貝,影響程式效率。

版本二的缺陷:非const型別的變數想得到它的連續賦值變得不可能,而且編譯器也會報錯。

版本三的缺陷:不能保持連續賦值時型別的統一性,違反了程式設計的慣例。如

[cpp]view plain

copy

print?

// 版本三的缺陷

string a, b, c;  

*a = b = c; // 必須這樣賦值給a,型別不統一!! 

任何未做深拷貝的版本都退化為預設版本。

[cpp]view plain

copy

print?

string& string::operator=(

const

string& rhs)  

陷阱重重的C 賦值過載函式operator

曾經有c 高手說過 看乙個c 程式設計師功底是否夠硬,讓他寫個賦值過載函式就能看出來了!在我看來,這種說法並不誇張。因為能將operator 函式寫好確實需要紮實的基礎,其中的陷阱真不少。先看 string string operator const string rhs 此 就是沒有規避自我賦值,...

C 拷貝建構函式和過載賦值函式

拷貝建構函式和過載賦值 的函式可以有效防止在淺複製過程中可能對於同一片記憶體釋放兩次的問題。然而拷貝函式和過載複製 的函式很容易混淆。拷貝建構函式是在物件建立時呼叫的,而賦值函式只能被已經存在的物件呼叫。乙個例子 類string的拷貝建構函式和賦值函式。拷貝建構函式 string string co...

C 賦值運算子的過載函式

賦值運算子的過載函式基本可以確定為兩種寫法,一種是初級程式設計師的寫法,另外一種是高階程式設計師的寫法,下面將對賦值運算子的過載函式的兩種形式進行解析。1 初級程式設計師的寫法 test operator const test src 防止記憶體丟失和淺拷貝 delete ptr 此處存在問題 pt...