在C++中,深度拷貝是指創(chuàng)建一個新對象,同時復(fù)制原始對象中的所有數(shù)據(jù)成員,而且對于原始對象中的指針類型數(shù)據(jù)成員,深度拷貝會為新對象分配新的內(nèi)存空間,并將原始對象中的指針數(shù)據(jù)成員指向新分配的內(nèi)存空間。為了測試深度拷貝是否正確實現(xiàn),可以編寫以下測試方法:
以下是一個簡單的示例代碼,用于測試深度拷貝:
#include <iostream>
using namespace std;
class MyClass {
public:
int* ptr;
MyClass(int x) : ptr(new int(x)) {}
// 禁止拷貝構(gòu)造函數(shù)和拷貝賦值運算符
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
};
void testDeepCopy() {
MyClass obj1(10);
MyClass obj2 = obj1; // 調(diào)用深度拷貝構(gòu)造函數(shù)
cout << "Before modification:" << endl;
cout << "obj1.ptr points to: " << *obj1.ptr << endl;
cout << "obj2.ptr points to: " << *obj2.ptr << endl;
*obj1.ptr = 20; // 修改obj1.ptr指向的內(nèi)容
cout << "After modification:" << endl;
cout << "obj1.ptr points to: " << *obj1.ptr << endl;
cout << "obj2.ptr points to: " << *obj2.ptr << endl;
}
int main() {
testDeepCopy();
return 0;
}
在這個示例中,MyClass
類包含一個指向整數(shù)的指針類型數(shù)據(jù)成員ptr
。在testDeepCopy
函數(shù)中,首先創(chuàng)建了一個MyClass
對象obj1
,并初始化其ptr
成員指向一個整數(shù)值10。然后,通過調(diào)用默認(rèn)的拷貝構(gòu)造函數(shù)(被刪除的拷貝構(gòu)造函數(shù)會觸發(fā)編譯錯誤,因此這里實際上是通過默認(rèn)的拷貝構(gòu)造函數(shù)進(jìn)行深度拷貝),創(chuàng)建了一個新的對象obj2
,并將obj1
的值復(fù)制給obj2
。接下來,修改obj1.ptr
指向的內(nèi)容,并輸出兩個對象的數(shù)據(jù)成員,以驗證深度拷貝是否正確實現(xiàn)。
需要注意的是,在上面的示例中,由于刪除了拷貝構(gòu)造函數(shù)和拷貝賦值運算符,因此無法通過賦值操作來測試深度拷貝。如果取消刪除這些函數(shù),并嘗試對對象進(jìn)行賦值操作,將會觸發(fā)編譯錯誤或運行時錯誤。因此,在實際測試中,應(yīng)該只使用構(gòu)造函數(shù)和賦值操作符進(jìn)行測試,以確保深度拷貝的正確性。