如果不主動編寫拷貝建構函式和賦值函式,編譯器將以「位拷貝」的方式自動生成預設的函式。倘若類中含有指標變數,那麼這兩個預設的函式就隱含了錯誤。
以類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被釋放了兩次。
拷貝建構函式和賦值函式非常容易混淆,常導致錯寫、錯用。拷貝建構函式是在物件被建立時呼叫的,而賦值函式只能被已經存在了的物件呼叫。
使用乙個已經建立完畢的物件來初始化乙個新物件
值傳遞的方式給函式引數傳值
值方式返回區域性物件
#include
using
namespace std;
class
person
person
(int age)
person
(const person& p)
~person()
cout <<
"析構函式"
<< endl;}}
;// 使用乙個已經建立完畢的物件來初始化乙個新物件
void
test1()
// 值傳遞的方式給函式引數傳值
void
dowork1
(person p)
void
test2()
// 值方式返回區域性物件
person dowork2()
void
test3()
intmain()
如:
a a1;
a a2;
a1 = a2;
強調:這裡a1,a2物件是已經存在的,是用a2物件來賦值給a1的!!
class
person
person operator
=(person &p)
// 深拷貝
p.m_age =
newint
(*m_age)
;// 返回物件本身
return
*this;}
~person()
cout <<
"析構函式"
<< endl;}}
;void
test1()
intmain()
拷貝建構函式與賦值建構函式
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...