由於並非所有的物件都會使用拷貝建構函式和賦值函式,程式設計師可能對這兩個函式有些輕視。請先記住以下的警告,在閱讀正文時就會多心:
本章開頭講過,如果不主動編寫拷貝建構函式和賦值函式,編譯器將以「位拷貝」的方式自動生成預設的函式。倘若類中含有指標變數,那麼這兩個預設的函式就隱含了錯誤。
以類string 的兩個物件a,b 為例,假設a.m_data 的內容為「hello」,b.m_data 的內容為「world」。現將 a 賦給b,預設賦值函式的「位拷貝」意味著執行b.m_data = a.m_data。
這將造成三個錯誤:
一是b.m_data 原有的記憶體沒被釋放,造成記憶體洩露;
二是b.m_data 和a.m_data 指向同一塊記憶體,a 或b 任何一方變動都會影響另一方;
三是在物件被析構時,m_data 被釋放了兩次。
拷貝建構函式和賦值函式非常容易混淆,常導致錯寫、錯用。拷貝建構函式是在物件被建立時呼叫的,而賦值函式只能被已經存在了的物件呼叫。以下程式中,第三個語句和第四個語句很相似,你分得清楚哪個呼叫了拷貝建構函式,哪個呼叫了賦值函式嗎?
string a(「hello」);
string b(「world」);
string c = a; // 呼叫了拷貝建構函式,最好寫成 c(a);
c = b; // 呼叫了賦值函式
本例中第三個語句的風格較差,宜改寫成string c(a) 以區別於第四個語句。
拷貝建構函式與賦值建構函式
include stdafx.h include include using namespace std class a a a a 過載拷貝函式 a int id,char t name a char name a operator a a 注意 此處一定要返回物件的引用,否則返回後其值立即消失!...
拷貝建構函式與賦值建構函式
什麼時候用拷貝建構函式,和賦值建構函式 一 當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 乙個物件以值傳遞的方式從函式返回 乙...
拷貝建構函式與賦值函式
為了便於說明我們以string類為例 首先定義string類,而並不實現其成員函式。class string 位拷貝拷貝的是位址,而值拷貝則拷貝的是內容。如果定義兩個string物件a和b。a.m data和b.m data分別指向一段區域,a.m data windows b.m data lin...