You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++数组深拷贝构造函数翻译——基于Stroustrup《C++编程:原理与实践》示例

Hey there! I've translated the array copy example (including the incomplete vector class code) from Section 18.3.1 "Copy Constructors" of Bjarne Stroustrup's Programming: Principles and Practices using C++ into Chinese, keeping all code and technical terms intact:

《Programming: Principles and Practices using C++》18.3.1节 拷贝构造函数之数组拷贝示例翻译

默认拷贝构造函数会拷贝源对象的成员变量。对于我们自定义的vector类来说,这意味着会直接拷贝elem指针和sz变量——但这并非我们想要的结果!来看下面的例子:

vector v1(10);
v1[2] = 99;
vector v2 = v1;

此时v1和v2会指向同一个数组。当v1离开作用域时,它会销毁自己指向的数组;而当v2离开作用域时,它会再次销毁同一个数组。这种“重复释放”属于undefined behavior(未定义行为),通常会导致程序崩溃。

因此我们需要自定义一个能实现*deep copy(深拷贝)*的拷贝构造函数:不只是拷贝指针,而是拷贝指针指向的所有元素。实现方式如下:

class vector {
private:
    int* elem; // 指向元素的指针
    int sz;    // 元素数量
public:
    vector(int s) : elem{new int[s]}, sz{s} { // 构造函数
        for (int i=0; i<sz; ++i) elem[i] = 0; // 初始化元素
    }

    vector(const vector& arg) // 拷贝构造函数
        : elem{new int[arg.sz]}, sz{arg.sz} {
        for (int i=0; i<sz; ++i)
            elem[i] = arg.elem[i]; // 拷贝元素
    }

    ~vector() { delete[] elem; } // 析构函数

    // ... 其他成员(例如operator[]、size)...
};

这个拷贝构造函数会先分配一块与原数组大小相同的新内存,然后将原数组中的每个元素逐一拷贝到新数组中。现在v1和v2拥有各自独立的数组,销毁其中一个不会对另一个造成影响。

内容的提问来源于stack exchange,提问作者Nour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:33:05