注意指標型別成員變數的深拷貝問題
拷貝構造屬於定義,並賦值
拷貝賦值屬於已經定義,只是賦值。
拷貝構造的深拷貝,因為如果提供了拷貝建構函式,則構造該物件時使用的是拷貝建構函式。
在拷貝建構函式中只需要:
分配新資源,拷貝新內容,返回自引用即可。
但是在拷貝賦值函式中,如果存在指標成員變數一般在物件定義時已經呼叫建構函式分配了記憶體。
拷貝賦值時,需要釋放舊資源,即釋放在定義時呼叫的建構函式分配的記憶體,在拷貝賦值函式中重新分配記憶體。
另外,避免自賦值,主要是在賦值時傳遞的物件自身,賦值源如果在釋放舊資源時被釋放,拷貝新內容的內容就是不存在的。
拷貝賦值注意:
1.避免自賦值;
2.分配新資源;
3.釋放舊資源;
4.拷貝新內容;
5.返回自引用;
#include using namespace std;
class integer
/* 預設的支援淺拷貝的拷貝建構函式
integer (integer const& that) : m_i (that.m_i) {}
*/// 自定義支援深拷貝的拷貝建構函式
integer (integer const& that) : m_i (new int (*that.m_i)) {}
~integer (void)
}/* 預設的支援淺拷貝的拷貝賦值運算子函式
integer& operator= (integer const& rhs)
*/// 自定義支援深拷貝的拷貝賦值運算子函式
integer& operator= (integer const& rhs)
return *this; // 返回自引用
}int* m_i;
};
支援深拷貝的拷貝構造和拷貝賦值類示例:
#include #include using namespace std;
class string
string (string const& that) :
m_str (strcpy ( new char [strlen (that.m_str) + 1], that.m_str)) {}
~string (void)
} // 老鳥
string& operator= (string const& rhs)
return *this;
} char const* c_str (void) const
private:
char* m_str;
}; int main (void)
拷貝建構函式和賦值構造
為什麼空類可以建立物件呢?複製建構函式的引數可以是 const 引用,也可以是非 const 引用。一般使用前者,這樣既能以常量物件 初始化後值不能改變的物件 作為引數,也能以非常量物件作為引數去初始化其他物件。乙個類中寫兩個複製建構函式,乙個的引數是 const 引用,另乙個的引數是非 const...
拷貝構造和賦值函式
每個類只有乙個賦值函式.1.如果不主動編寫拷貝建構函式和賦值函式,編譯器將以 位拷貝 的方式自動生成預設的函式。倘若類中含有指標變數,那麼這兩個預設的函式就隱含了錯誤。以類string的兩個物件a,b為例,假設a.m data的內容為 hello b.m data的內容為 world 現將a賦給b,...
Cpp 拷貝構造與拷貝賦值
如果乙個類包含指標形式的成員變數,系統提供的預設拷貝建構函式,只是複製了指標成員變數本身,而沒有複製該變數所指向的內容,這種拷貝方式被稱為淺拷貝。淺拷貝將導致不同物件間的資料共享,同時會在析構函式中引發 double free 異常。為此就必須自己定義乙個支援複製內容即深拷貝的拷貝建構函式。類的預設...