c++拷贝构造函数(深拷贝,浅拷贝)
来源:千锋教育
发布人:wjy
2023-04-23
推荐
在线提问>>
在C++中,拷贝构造函数是一个特殊的构造函数,用于创建一个新对象并将其初始化为现有对象的副本。拷贝构造函数可以执行深拷贝或浅拷贝操作,具体取决于对象的数据成员类型和实现。
浅拷贝是指将现有对象的数据成员的值逐个复制到新对象中的过程。对于基本数据类型(如整数或浮点数)或指向动态分配内存的指针,浅拷贝通常是可以的。但是,如果对象包含指向动态分配内存的指针,则浅拷贝可能会导致问题,因为新对象和原始对象将共享相同的内存,可能会导致未定义的行为。
深拷贝是指创建新对象并将现有对象的所有数据成员复制到新对象中的过程,包括指向动态分配内存的指针。在深拷贝中,新对象拥有自己的内存空间,不与原始对象共享内存,因此可以独立地修改它们的数据成员。通常使用深拷贝来避免在多个对象之间共享内存所导致的问题。
以下是使用浅拷贝和深拷贝的示例代码:
// 使用浅拷贝
class ShallowCopy {
public:
ShallowCopy(int* ptr) : ptr_(ptr) {}
ShallowCopy(const ShallowCopy& other) : ptr_(other.ptr_) {}
~ShallowCopy() {}
private:
int* ptr_;
};
// 使用深拷贝
class DeepCopy {
public:
DeepCopy(int* ptr) {
ptr_ = new int(*ptr);
}
DeepCopy(const DeepCopy& other) {
ptr_ = new int(*other.ptr_);
}
~DeepCopy() {
delete ptr_;
}
private:
int* ptr_;
};
在这个示例中,我们定义了两个类:ShallowCopy和DeepCopy,它们都具有一个int类型的指针成员ptr_,表示它们拥有一个指向动态分配内存的指针。在ShallowCopy中,我们使用浅拷贝来复制指针,而在DeepCopy中,我们使用深拷贝来复制指针。在浅拷贝中,新对象和原始对象共享相同的内存,因此在析构函数中不需要释放内存。但是,在深拷贝中,我们必须在析构函数中释放分配的内存,否则会导致内存泄漏。
