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
相关产品推荐
相关产品推荐

