淺拷貝和深拷貝是針對(duì)對(duì)象的拷貝操作而言的。
淺拷貝:淺拷貝是指僅僅拷貝對(duì)象的值,而不拷貝對(duì)象所指向的內(nèi)存。這樣,在拷貝對(duì)象和原始對(duì)象中會(huì)有一個(gè)指針指向同一塊內(nèi)存。如果拷貝對(duì)象和原始對(duì)象中的指針指向的內(nèi)存被釋放,那么兩個(gè)對(duì)象將指向同一塊無效內(nèi)存,可能會(huì)導(dǎo)致程序出錯(cuò)。
實(shí)現(xiàn)淺拷貝的方式主要有兩種:
class MyClass {
public:
int *data;
int size;
// 默認(rèn)的拷貝構(gòu)造函數(shù)
MyClass(const MyClass& other) {
size = other.size;
data = other.data;
}
// 默認(rèn)的賦值運(yùn)算符
MyClass& operator=(const MyClass& other) {
if (this != &other) {
size = other.size;
data = other.data;
}
return *this;
}
};
class MyClass {
public:
int *data;
int size;
// 自定義的拷貝構(gòu)造函數(shù)
MyClass(const MyClass& other) {
size = other.size;
data = other.data;
}
// 自定義的賦值運(yùn)算符
MyClass& operator=(const MyClass& other) {
if (this != &other) {
size = other.size;
data = other.data;
}
return *this;
}
};
深拷貝:深拷貝是指在拷貝對(duì)象時(shí),會(huì)重新分配一塊內(nèi)存,并將原始對(duì)象所指向的內(nèi)存內(nèi)容拷貝到新的內(nèi)存中。這樣,在拷貝對(duì)象和原始對(duì)象中就沒有指針指向同一塊內(nèi)存,修改拷貝對(duì)象不會(huì)影響原始對(duì)象。
實(shí)現(xiàn)深拷貝的方式主要有兩種:
class MyClass {
public:
int *data;
int size;
// 自定義的拷貝構(gòu)造函數(shù)
MyClass(const MyClass& other) {
size = other.size;
data = new int[size];
std::copy(other.data, other.data + size, data);
}
// 自定義的賦值運(yùn)算符
MyClass& operator=(const MyClass& other) {
if (this != &other) {
size = other.size;
delete[] data;
data = new int[size];
std::copy(other.data, other.data + size, data);
}
return *this;
}
// 析構(gòu)函數(shù)
~MyClass() {
delete[] data;
}
};
class MyClass {
public:
std::shared_ptr<int> data;
int size;
// 自定義的拷貝構(gòu)造函數(shù)
MyClass(const MyClass& other) {
size = other.size;
data = std::make_shared<int[]>(size);
std::copy(other.data.get(), other.data.get() + size, data.get());
}
// 自定義的賦值運(yùn)算符
MyClass& operator=(const MyClass& other) {
if