我们什么时候应该用 C++ 编写自己的复制构造函数?
复制构造函数是一个成员函数,它使用同一类的另一个对象来初始化一个对象。 (请参阅本文以供参考)。
我们什么时候应该编写自己的复制构造函数?
C++ 编译器为类提供默认的复制构造函数(和赋值运算符)。当我们不提供复制构造函数(和赋值运算符)的实现并尝试使用同一个类的已初始化对象初始化对象时,复制构造函数被调用并在目标对象中一一复制类的成员。
但是默认复制构造函数(和赋值运算符)的问题是:
- 当我们有在运行时动态初始化的成员时,默认的复制构造函数会使用动态分配的内存地址复制该成员,而不是该内存的真实副本。
- 现在,两个对象都指向同一个内存,其中一个对象的变化反映在另一个对象中。
- 此外,主要的灾难性影响是,当我们删除其中一个对象时,另一个对象仍然指向相同的内存,这将是一个悬空指针,并且内存泄漏也是这种方法的一个可能问题。
因此,仅当对象具有指针或资源的任何运行时分配(如文件句柄、网络连接等)时,我们才需要定义自己的复制构造函数。
默认构造函数只做浅拷贝。
只有使用用户定义的复制构造函数才能进行深度复制。在用户定义的复制构造函数中,我们确保复制对象的指针(或引用)指向新的内存位置。
因此,在这种情况下,我们应该始终编写自己的复制构造函数(和赋值运算符)。