cpp浅拷贝或深拷贝中的默认构造函数? 默认复制构造函数在C++中使用浅层或深拷贝吗?

cpp浅拷贝或深拷贝中的默认构造函数? 默认复制构造函数在C++中使用浅层或深拷贝吗?,c++,deep-copy,shallow-copy,C++,Deep Copy,Shallow Copy,我真的对cpp中的默认复制构造函数感到困惑,因为它执行浅复制或深复制,就像我执行v2=v1时一样隐式生成的拷贝构造函数(和赋值运算符)执行浅拷贝。< /P> 值类型的浅拷贝和深拷贝之间没有区别 现在如果我做了v2[0]=1;它不会被反射 除非v2的类型是引用类型,否则没有理由期望此类操作得到反映。您的问题是错误的问题 首先,C++默认拷贝/赋值是成员的;它根据成员的行为递归地复制/分配 设计好的C++类型遵循3个不同类型的基元类型的复制/分配时所做的一些模式;值、引用和指针语义 值语义类型的行为

我真的对cpp中的默认复制构造函数感到困惑,因为它执行浅复制或深复制,就像我执行
v2=v1时一样v1={1,2,3}
,现在如果我已经做了
v2[0]=1它不会被反射,但我听说它是浅拷贝,有人能解释一下吗?

它也不会。它是一个成员复制。也就是说,它使用复制构造函数复制类的所有成员。如果这些成员具有执行深度复制的复制构造函数,那么您将获得深度复制,如果它们执行浅层复制,那么您将获得浅层复制,或者它们可以完全执行其他操作


深层拷贝和浅拷贝不是C++概念,而是C++让你做一个深或浅的拷贝,你喜欢。

< P>隐式生成的拷贝构造函数(和赋值运算符)执行浅拷贝。< /P> 值类型的浅拷贝和深拷贝之间没有区别

现在如果我做了v2[0]=1;它不会被反射


除非
v2
的类型是引用类型,否则没有理由期望此类操作得到反映。

您的问题是错误的问题

首先,C++默认拷贝/赋值是成员的;它根据成员的行为递归地复制/分配

<>设计好的C++类型遵循3个不同类型的基元类型的复制/分配时所做的一些模式;值、引用和指针语义

值语义类型的行为类似于值。这大致相当于您的“深度复制”。修改一个遵循值语义的变量不会改变另一个变量
std::vector
是一种值语义类型,与
int
double
std::string
和其他
std
容器类型一样。值语义是一种强大的模式,它使关于程序行为的推理变得容易。注意,值语义不需要实现为值;向量通常实现为三个指针,并重载构造/复制/etc

引用语义类型的行为类似C++引用类型--<代码> int和< />代码。这与Java/C#引用不同。C++引用是别名;代码>整数&a=b

表示
a
b
的另一个名称。然后
a=7
使
a
b
相等
7
。如果您有另一个引用
c
a=c
将不会重新绑定
a
以引用
c
;它会将
a
引用的内容更改为与
c
引用的内容具有相同的值

具有引用语义的复杂对象很少

指针语义类似于引用语义,但赋值会重新绑定指针指向的对象。有时,创建新指针需要额外的操作,如
&
。具有指针语义的类型包括
std::reference\u wrapper
std::string\u view
std::shared\u ptr
gsl::span
int*

通常,在同一类型中混合具有不同语义的成员是个坏主意;0/3/5规则规定,最好的move/copy/assogn/ctor/dtor是空的。您的资源管理类型使用RAII并编写这些特殊成员,其他类型则聚合它们。值语义类型不会与引用/指针混合使用,以使复合类获得一致的语义

TL;医生:这要看情况。请阅读有关您成员的文档。记录类型的语义,以便用户知道需要什么


但是,请注意,引用语义与存储在std容器中不兼容。

请提供一个例子,我们不知道您的类看起来如何。EC++实际上没有深层或浅层副本的概念,只有特定类的语义正确副本的概念。@NeilButterworth,除非学术界介入。然后所有赌注都被取消。默认的复制构造函数复制变量的内容,不多也不少。如果您有一个复制构造函数,那么复制构造函数中的代码将被执行。紧密相关:注意,这意味着如果您的类包含指针,那么将复制指针,并且只复制指针。现在有两个对象指向同一个对象。取决于这个指向对象的所有权,这可能是不好的。这可能被否决了,因为不熟悉C++拥有具有值语义的复杂对象的能力的人不清楚这一点。为了提高性能,我建议详细说明值/引用(和指针)语义,成员语义如何影响类型的默认语义,以及该语义如何流回深/浅conxept。因为你所说的一切都是真的,但我怀疑这对我写的作品没什么用处。嗯,也许我会回答。你说“值类型的浅拷贝和深拷贝没有区别”,这是什么意思?因为它们与赋值运算符共享相同的内存(浅拷贝)。@RobinKhurana这意味着值类型只有一种拷贝—浅拷贝和深拷贝之间没有区别<代码>因为它们共享相同的内存
什么共享相同的内存?