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

问题描述 投票:-3回答:2

如果我们有默认值,为什么我们使用手动复制构造函数?默认和手动创建的复制构造函数有什么区别?请给出一个简单的C ++编码示例,以便我能够轻松快速地理解。我们可以编写多个复制构造函数吗?

c++
2个回答
1
投票

如果我们有默认值,为什么我们使用手动复制构造函数?默认和手动创建的复制构造函数有什么区别?

默认复制构造函数执行浅复制,您需要在执行深层复制时定义复制构造函数。

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

我们可以编写多个复制构造函数吗?

复制构造函数具有标准签名,因此不能重载。不可能有一次复制构造函数。


0
投票

复制对象意味着什么?它并不总是很明显如何回答,所以编译器不能总是知道,你必须告诉它如何复制。

一个简单的例子:

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

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

在制作Foo的副本后,副本应该将some_val指向同一个实例(浅层副本),还是应该复制Foo副本some_val指向的值(深层副本)?

如果您使用编译器生成的副本,您将获得第一个。如果你想要别的东西,你需要提供你自己的定义复制Foo的意义。

© www.soinside.com 2019 - 2024. All rights reserved.