首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cpp中的默认复制构造函数是浅拷贝还是深拷贝?

cpp中的默认复制构造函数是浅拷贝还是深拷贝?
EN

Stack Overflow用户
提问于 2018-07-18 15:40:44
回答 3查看 2.3K关注 0票数 5

默认的复制构造函数是在C++中执行浅拷贝还是深拷贝?

我真的很困惑于cpp中的默认复制构造函数,就像它做浅拷贝或深拷贝一样,就像我做v2=v1;假设的v1={1,2,3}时一样,现在如果我做了v2[0]=1;,它不会被反射,但是我听说它做的是浅拷贝,谁能解释一下吗?

EN

回答 3

Stack Overflow用户

发布于 2018-07-18 15:46:22

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

深拷贝和浅拷贝并不是C++的概念,相反,C++允许您根据自己的喜好进行深度或浅拷贝。

票数 9
EN

Stack Overflow用户

发布于 2018-07-18 16:41:27

你的问题问错了。

首先,C++默认的复制/分配是成员级的;它根据成员的操作递归地复制/分配。

设计良好的C++类型在复制/分配时遵循几种模式,这些模式与3种不同类型的原语类型相一致: value、reference和amd指针语义。

值语义类型的行为类似于值。这大致相当于你的“深拷贝”。修改一个跟随值语义的变量永远不会改变另一个变量。std::vector是一种值语义类型,intdoublestd::string和其他std容器类型也是如此。值语义是一种强大的模式,使程序行为的推理变得容易。注意,值语义不需要实现为值;向量通常是作为三个指针实现的,构造/复制/etc重载。

引用语义类型的行为类似于C++引用类型-- int&。这与Java/C#引用不同。C++引用是别名;int& a=b;表示ab的另一个名称。然后a=7使ab都等于7。如果您有另一个引用ca=c将不会重新绑定a来引用c;它会将a引用的内容更改为与c引用的值相同的值。

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

指针语义就像引用语义,但是赋值会重新绑定它指向的对象。有时需要额外的操作(如& )来创建一个新指针。具有指针语义的类型包括std::reference_wrapperstd::string_viewstd::shared_ptr<double>gsl::span<char>int*

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

这要看情况而定。阅读关于您的成员的文档。记录您的类型所具有的语义,以便用户知道预期的内容。

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

票数 3
EN

Stack Overflow用户

发布于 2018-07-18 15:49:37

隐式生成的复制构造函数(和赋值操作符)执行浅拷贝。

浅拷贝和值类型的深拷贝之间没有区别。

现在,如果我做了v2=1,它就不会被反映出来

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51406033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档