浅拷贝和深拷贝是针对对象的拷贝操作而言的。
浅拷贝:浅拷贝是指仅仅拷贝对象的值,而不拷贝对象所指向的内存。这样,在拷贝对象和原始对象中会有一个指针指向同一块内存。如果拷贝对象和原始对象中的指针指向的内存被释放,那么两个对象将指向同一块无效内存,可能会导致程序出错。
实现浅拷贝的方式主要有两种:
class MyClass {
public:
int *data;
int size;
// 默认的拷贝构造函数
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;
}
};
class MyClass {
public:
int *data;
int size;
// 自定义的拷贝构造函数
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;
}
};
深拷贝:深拷贝是指在拷贝对象时,会重新分配一块内存,并将原始对象所指向的内存内容拷贝到新的内存中。这样,在拷贝对象和原始对象中就没有指针指向同一块内存,修改拷贝对象不会影响原始对象。
实现深拷贝的方式主要有两种:
class MyClass {
public:
int *data;
int size;
// 自定义的拷贝构造函数
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) {
size = other.size;
delete[] data;
data = new int[size];
std::copy(other.data, other.data + size, data);
}
return *this;
}
// 析构函数
~MyClass() {
delete[] data;
}
};
class MyClass {
public:
std::shared_ptr<int> data;
int size;
// 自定义的拷贝构造函数
MyClass(const MyClass& other) {
size = other.size;
data = std::make_shared<int[]>(size);
std::copy(other.data.get(), other.data.get() + size, data.get());
}
// 自定义的赋值运算符
MyClass& operator=(const MyClass& other) {
if