面试题答案
一键面试重写拷贝构造函数的情况
当类中包含动态分配的资源(如动态数组),且默认的拷贝构造函数执行的是浅拷贝时,会导致多个对象共享同一块动态内存,当其中一个对象析构释放内存后,其他对象再访问这块内存就会出现悬空指针等错误。此时需要重写拷贝构造函数,进行深拷贝,为新对象分配独立的内存空间并复制数据。
重写示例代码
#include <iostream>
class MyArray {
private:
int* data;
int size;
public:
// 构造函数
MyArray(int s) : size(s) {
data = new int[size];
for (int i = 0; i < size; ++i) {
data[i] = 0;
}
}
// 析构函数
~MyArray() {
delete[] data;
}
// 重写拷贝构造函数
MyArray(const MyArray& other) : size(other.size) {
data = new int[size];
for (int i = 0; i < size; ++i) {
data[i] = other.data[i];
}
}
// 重载赋值运算符(为了代码完整性)
MyArray& operator=(const MyArray& other) {
if (this != &other) {
delete[] data;
size = other.size;
data = new int[size];
for (int i = 0; i < size; ++i) {
data[i] = other.data[i];
}
}
return *this;
}
// 获取数组元素
int get(int index) const {
if (index >= 0 && index < size) {
return data[index];
}
return -1; // 错误指示
}
// 设置数组元素
void set(int index, int value) {
if (index >= 0 && index < size) {
data[index] = value;
}
}
};
int main() {
MyArray arr1(5);
arr1.set(0, 10);
MyArray arr2(arr1); // 使用重写的拷贝构造函数
std::cout << "arr2[0]: " << arr2.get(0) << std::endl;
return 0;
}
在上述代码中,MyArray
类包含一个动态分配的 int
数组 data
。重写的拷贝构造函数为新对象分配了独立的内存,并将原对象的数据复制到新对象中,避免了浅拷贝带来的问题。