1. 拷贝构造函数的本质与实现
在C++中,拷贝构造函数是一个特殊的成员函数,它用于创建一个新对象作为现有对象的副本。当发生以下情况时,拷贝构造函数会被自动调用:
- 通过一个对象初始化另一个对象时
- 对象作为函数参数按值传递时
- 对象作为函数返回值时
一个典型的拷贝构造函数声明如下:
cpp复制class MyClass {
public:
MyClass(const MyClass& other); // 拷贝构造函数
};
1.1 浅拷贝与深拷贝问题
默认情况下,编译器会为我们生成一个浅拷贝构造函数。这个默认实现会逐个成员地进行复制,对于指针成员来说,这会导致两个对象指向同一块内存:
cpp复制class ShallowCopyExample {
int* data;
public:
ShallowCopyExample(int size) { data = new int[size]; }
~ShallowCopyExample() { delete[] data; }
};
void problemDemo() {
ShallowCopyExample obj1(10);
ShallowCopyExample obj2 = obj1; // 浅拷贝,两个对象共享data指针
// 当obj1和obj2析构时,同一内存会被delete两次!
}
要解决这个问题,我们需要实现深拷贝:
cpp复制class DeepCopyExample {
int* data;
int size;
public:
DeepCopyExample(int sz) : size(sz) { data = new int[size]; }
DeepCopyExample(const DeepCopyExample& other) : size(other.size) {
data = new int[size];
std::copy(other.data, other.data + size, data);
}
~DeepCopyExample() { delete[] data;
