為了便於說明我們以string類為例:
首先定義string類,而並不實現其成員函式。
class string;
位拷貝拷貝的是位址,而值拷貝則拷貝的是內容。如果定義兩個string物件a和b。a.m_data和b.m_data分別指向一段區域,a.m_data="windows",b.m_data=「linux";
如果未重寫賦值函式,將b賦給a;則編譯器會預設進行位拷貝,a.m_data=b.m_data
則a.m_data和b.m_data指向同一塊區域,雖然a.m_data指向的內容會改變成"linux",但是這樣容易出現這些問題:
(1):a.m_data原來指向的記憶體區域未釋放,造成記憶體洩露。
(2):a.m_data和b.m_data指向同一塊區域,任何一方改變都會影響另一方
(3):當物件被析構時,b.m_data被釋放兩次。
對於編譯器,如果不主動編寫拷貝函式和賦值函式,它會以「位拷貝」的方式自動生成預設的函式。
如果重寫賦值函式和拷貝建構函式後,
a.m_data=b.m_data,進行的是值拷貝,會將b.m_data的內容賦給a.m_data,a.m_data還是指向原來的記憶體區域,但是其內容改變。
拷貝建構函式與賦值建構函式
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 注意 此處一定要返回物件的引用,否則返回後其值立即消失!...
拷貝建構函式與賦值建構函式
什麼時候用拷貝建構函式,和賦值建構函式 一 當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 乙個物件以值傳遞的方式從函式返回 乙...
拷貝建構函式與賦值函式
拷貝建構函式 只有單個形參,並且該形參時本類物件的引用 經常使用const修飾 的建構函式.預設拷貝建構函式 在沒有定義拷貝建構函式的時候,編譯器將自動生成乙個 預設拷貝建構函式將執行的操作 對該類的每個成員執行初始化 對於基礎型別直接賦值,對於其所有物件成員逐個呼叫其對應的拷貝建構函式.特別的 倘...