在c++中,當乙個類為「空」時,裡面真的為空嗎?不是的,裡面有四個函式。分別是建構函式,析構函式,拷貝建構函式,過載賦值操作符。
class test;
等價於class test;
拷貝建構函式和過載賦值操作符有什麼區別?
test t1;
test t2(t1) // 等價於test t2 = t1,此時呼叫拷貝建構函式,即初始化時調
用拷貝建構函式
test t3;
t3 = t1; //這裡為賦值操作,呼叫賦值操作
淺拷貝和淺賦值存在的問題:
class test
test(const test& t) //淺拷貝
test& operator= (const test& t) //淺賦值
return *this; //確保可以連續賦值
}void mydelete(void)
};test t1(10);
test t2 = t1; //等價於test t2(t1),這裡呼叫淺拷貝建構函式;
...mydelete();
t2,mydelete();
這時會發生什麼情況?會出現記憶體錯誤。因為在t2的初始化時呼叫了系
統預設提供的淺拷貝函式,會將t1.mptr直接賦值給t2.mptr,使得
t1.mptr和t2.mptr指向同一段堆空間,然後呼叫t1,mydelete(),
t2,mydelete()會釋放兩次記憶體,會報錯,也就是說只要在類中有使用
系統統資源時,不能使用淺拷貝建構函式。淺賦值操作也有同樣的問題。
當我們使用系統資源時,如何避免這種情況?只能重寫拷貝建構函式和賦值操作。
重寫淺拷貝建構函式,實現深拷貝。
test(const test& t) //深拷貝
test& operator= (const test& t) //深賦值
return *this; //確保可以連續賦值
}
拷貝建構函式和賦值操作符
類有預設的建構函式 拷貝建構函式 析構函式 賦值操作運算子 和取位址運算子 預設的賦值操作運算子和預設的拷貝建構函式類似,對於每個非static成員,都是執行逐個成員賦值 memberwise assignment 同時也是按位賦值 bitwise copy 即,只是簡單地將每個類成員的記憶體中的直...
賦值操作符和拷貝建構函式
最近開發乙個專案,用到了單例模式,標頭檔案大概如下 class crecguard crecguard private void guard void unguard private critical section cs template class csingleton 禁止建構函式 csing...
C 中拷貝建構函式與拷貝賦值操作符
當我們顯式或者隱式地對該型別進行拷貝操作時,就會用到該類的拷貝建構函式 copy construction 和拷貝賦值操作符 copy assignment operator 如果乙個建構函式的第乙個引數是自身類型別的引用,且任何額外引數都有預設值,則此建構函式是拷貝建構函式。拷貝建構函式的詳細介紹...