为什么我们在C ++中使用手动复制构造函数?

时间:2018-10-11 15:40:40

标签: c++

如果拥有默认副本构造函数,为什么要使用手动副本构造函数?默认副本和手动创建的副本构造函数之间有什么区别?请给一个简单的C ++编码示例,这样我就可以轻松快速地理解。我们可以编写多个副本构造函数吗?

2 个答案:

答案 0 :(得分:1)

  

如果拥有默认副本构造函数,为什么要使用手动副本构造函数?默认和手动创建的副本构造函数有什么区别?

默认复制构造函数执行浅表复制,在需要进行深度复制时定义复制构造器。

例如,如果您的类中有一个指针并在构造函数中动态分配内存,则在这种情况下,您应显式提供复制构造函数以进行指针内容的深层复制,否则默认的复制构造函数将复制指针本身,其中大部分不想做的时间。

  

我们可以编写多个副本构造函数吗?

Copy构造函数具有标准签名,因此不能重载。复制构造函数不能再有那么多了。

答案 1 :(得分:0)

复制对象是什么意思?如何回答这个问题并不总是很明显,所以编译器不能总是知道,您必须告诉它如何复制。

一个简单的例子:

struct Foo {
    int* some_val; // raw pointer only for the sake of the example !!
};

默认副本将仅复制成员。这是你想要的吗?

在复制Foo之后,该副本应具有some_val指向同一实例(浅副本),还是应复制Foo副本,复制{{所指向的值1}}(深拷贝)?

如果使用编译器生成的副本,则将获得第一个副本。如果您还需要其他内容,则需要提供自己的定义,以复制some_val