MST
星途 面试题库

面试题:C++ 中重写拷贝构造函数场景分析

假设你正在开发一个管理动态数组的类 `MyArray`,数组元素为 `int` 类型。简述在什么情况下需要重写拷贝构造函数,并且给出重写的示例代码。
24.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

重写拷贝构造函数的情况

当类中包含动态分配的资源(如动态数组),且默认的拷贝构造函数执行的是浅拷贝时,会导致多个对象共享同一块动态内存,当其中一个对象析构释放内存后,其他对象再访问这块内存就会出现悬空指针等错误。此时需要重写拷贝构造函数,进行深拷贝,为新对象分配独立的内存空间并复制数据。

重写示例代码

#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。重写的拷贝构造函数为新对象分配了独立的内存,并将原对象的数据复制到新对象中,避免了浅拷贝带来的问题。