#include
using
namespace
std;
class cmystring
cmystring(const cmystring& str)
cmystring& operator = (const cmystring& str);
int display()
~cmystring()
private:
char* m_pdata;
};cmystring& cmystring::operator=(const cmystring& str)
//當跳出if語句塊後,tmpstring會自動呼叫析構函式進行記憶體的釋放,也就釋放了當前物件所指向的記憶體空間
return *this;
}int main()
執行結果:
可以發現三個類物件例項的位址都是相同,也就是說沒有重新開闢新記憶體,都是將指標指向同乙個記憶體位址,完成賦值操作。一方面避免重新開闢記憶體時出現記憶體分配失敗,一方面也提高的賦值效率,僅僅是指標的指向而已。
#include
#include
#include
using
namespace
std;
class cmystring
cmystring(const cmystring& str)
cmystring& operator = (const cmystring& str);
int display()
~cmystring()
private:
char* m_pdata;
};cmystring& cmystring::operator=(const cmystring& str)
int main()
執行結果:
可見三個物件例項中的m_pdata的位址是不相同的,但是這裡同樣存在乙個問題,就是new char語句很有可能出現分配記憶體失敗的情況,所以此時將導致程式崩潰。這是一種深拷貝的問題。
幾點注意:
返回型別需要宣告為該類的引用,所以返回的是*this.因為我們知道在乙個類中,this是指向當前物件的指標,那麼指標中的類容*this自然就是當前物件的位址,即該型別的引用。之所以要這樣宣告,是為了可以連續賦值操作;
函式引數需要宣告為常量引用。分兩部講,引用的目的是因為,如果宣告為類的例項,那麼從形參到實參就存在一次拷貝,會呼叫類的拷貝建構函式,這樣非常的消耗資源,宣告引用就不存在這個問題;常量是因為,我們是賦值操作,當然不希望修改實參的內容;
是否釋放例項自身已有的記憶體,如果忘記,則會出現記憶體洩露的情況。(在電腦科學中,記憶體洩漏指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,導致在釋放該段記憶體之前就失去了對該段記憶體的控制,從而造成了記憶體的浪費。)
是否判斷當前傳入的引數和例項自身是不是同一物件,如果是同乙個則不進行賦值操作,直接返回,否則兩者是同一物件的情況下依然進行賦值操作,那麼首先我們就會釋放例項自身已有的記憶體,那麼這樣傳入的引數的記憶體同時也被釋放了,也就造成這段內容永遠的消失了。
劍指offer 1 賦值運算子函式
題目描述 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。實現如下 是我的解法,適合c 初級程式設計師 created by yanpan on 2018 9 30.if 1 include using namespace std class cmystring cmystring...
劍指offer 1 賦值運算子函式
1.返回型別宣告為該型別的引用才可以連續賦值 2.傳入的引數型別宣告為該型別的常量引用,避免形參到實參的傳遞呼叫複製建構函式 3.在分配記憶體之前先釋放記憶體避免記憶體洩漏 4.判斷傳入的引數和當前例項 this 是否相同,如果相同則直接返回,否則釋放記憶體操作作用於本身。include inclu...
劍指offer 1 賦值元素運算子函式
為了乙個類新增乙個賦值運算子函式 class str 賦值運算子,也就是過載 號運算子。過載賦值運算子需要注意 返回自身引用,因此可以實現連 操作 傳入引數為引用,減少開銷 如果類內物件,由在堆上分配記憶體。或者說是類的析構函式會釋放某些資料成員,那麼該資料成員就需要深度拷貝 傳入自身的時候,需要判...