MST
星途 面试题库

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

假设有一个自定义类 `MyClass`,它包含一个动态分配的数组成员变量 `int* data`,请解释为什么在此类中通常需要重写拷贝构造函数,并给出重写后的拷贝构造函数代码示例。
23.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

在包含动态分配的数组成员变量的类中,默认的拷贝构造函数执行的是浅拷贝。浅拷贝只是简单地复制指针的值,这意味着两个对象的 data 指针会指向同一块内存。当其中一个对象销毁时,这块内存会被释放,导致另一个对象的 data 指针成为悬空指针,在后续使用时会引发未定义行为。因此,需要重写拷贝构造函数来执行深拷贝,即分配新的内存并将源对象数组中的内容复制到新内存中。

以下是重写后的拷贝构造函数代码示例:

class MyClass {
private:
    int* data;
    int size;

public:
    MyClass(int s) : size(s) {
        data = new int[size];
    }

    // 重写的拷贝构造函数
    MyClass(const MyClass& other) : size(other.size) {
        data = new int[size];
        for (int i = 0; i < size; i++) {
            data[i] = other.data[i];
        }
    }

    ~MyClass() {
        delete[] data;
    }
};