在C++中,淺拷貝和深拷貝是通過復制構造函數和賦值運算符實現的。下面是一個簡單的例子來說明如何實現它們。
假設我們有一個類MyClass
,它包含一個指向動態分配內存的指針。
class MyClass {
public:
int *data;
int size;
// 構造函數
MyClass(int size) : size(size) {
data = new int[size];
}
// 析構函數
~MyClass() {
delete[] data;
}
};
淺拷貝:
淺拷貝是指將對象的指針或引用復制到新對象,而不是復制它們所指向的數據。在這種情況下,源對象和新對象將共享相同的數據。這可能會導致問題,因為當一個對象被銷毀時,它將刪除數據,而另一個對象仍然引用該數據。
// 復制構造函數
MyClass::MyClass(const MyClass &other) : size(other.size) {
data = other.data; // 淺拷貝,只復制指針
}
// 賦值運算符
MyClass &operator=(const MyClass &other) {
if (this != &other) {
size = other.size;
data = other.data; // 淺拷貝,只復制指針
}
return *this;
}
深拷貝:
深拷貝是指復制對象所指向的數據,而不僅僅是指針或引用。這樣,源對象和新對象將擁有自己的數據副本,不會相互影響。
// 復制構造函數
MyClass::MyClass(const MyClass &other) : size(other.size) {
data = new int[size]; // 深拷貝,分配新內存并復制數據
std::copy(other.data, other.data + size, data);
}
// 賦值運算符
MyClass &operator=(const MyClass &other) {
if (this != &other) {
int *newData = new int[other.size]; // 深拷貝,分配新內存并復制數據
std::copy(other.data, other.data + other.size, newData);
delete[] data; // 釋放原始數據
data = newData;
size = other.size;
}
return *this;
}
注意:在實現深拷貝的賦值運算符中,我們需要先創建一個新的數據副本,然后釋放原始數據,最后將新數據分配給當前對象。這樣可以確保在賦值過程中不會出現內存泄漏或雙重刪除。