默认的复制构造函数是在C++中执行浅拷贝还是深拷贝?
我真的很困惑于cpp中的默认复制构造函数,就像它做浅拷贝或深拷贝一样,就像我做v2=v1;
假设的v1={1,2,3}
时一样,现在如果我做了v2[0]=1;
,它不会被反射,但是我听说它做的是浅拷贝,谁能解释一下吗?
发布于 2018-07-18 15:46:22
也不起作用。它做了一个成员级的复制。也就是说,它使用类的复制构造函数复制类的所有成员。如果这些成员有执行深度复制的复制构造函数,那么您将得到一个深拷贝,如果他们执行一个浅拷贝,那么您将得到一个浅拷贝,或者他们可以完全执行其他操作。
深拷贝和浅拷贝并不是C++的概念,相反,C++允许您根据自己的喜好进行深度或浅拷贝。
发布于 2018-07-18 16:41:27
你的问题问错了。
首先,C++默认的复制/分配是成员级的;它根据成员的操作递归地复制/分配。
设计良好的C++类型在复制/分配时遵循几种模式,这些模式与3种不同类型的原语类型相一致: value、reference和amd指针语义。
值语义类型的行为类似于值。这大致相当于你的“深拷贝”。修改一个跟随值语义的变量永远不会改变另一个变量。std::vector
是一种值语义类型,int
、double
、std::string
和其他std
容器类型也是如此。值语义是一种强大的模式,使程序行为的推理变得容易。注意,值语义不需要实现为值;向量通常是作为三个指针实现的,构造/复制/etc重载。
引用语义类型的行为类似于C++引用类型-- int&
。这与Java/C#引用不同。C++引用是别名;int& a=b;
表示a
是b
的另一个名称。然后a=7
使a
和b
都等于7
。如果您有另一个引用c
,a=c
将不会重新绑定a
来引用c
;它会将a
引用的内容更改为与c
引用的值相同的值。
具有引用语义的复杂对象很少。
指针语义就像引用语义,但是赋值会重新绑定它指向的对象。有时需要额外的操作(如&
)来创建一个新指针。具有指针语义的类型包括std::reference_wrapper
、std::string_view
、std::shared_ptr<double>
、gsl::span<char>
和int*
。
通常,在同一类型中混合具有不同语义的成员是个坏主意;0/3/5的规则规定,最好的move/copy/assogn/ctor/dtor是空的。您的资源管理类型使用RAII并编写这些特殊成员,其他类型聚合它们。值语义类型不与引用/指针混合使用,这样组合类才能获得一致性语义。
这要看情况而定。阅读关于您的成员的文档。记录您的类型所具有的语义,以便用户知道预期的内容。
但是,请注意,引用语义与存储在std容器中是不兼容的。
发布于 2018-07-18 15:49:37
隐式生成的复制构造函数(和赋值操作符)执行浅拷贝。
浅拷贝和值类型的深拷贝之间没有区别。
现在,如果我做了v2=1,它就不会被反映出来
除非v2
类型是引用类型,否则没有理由期望这种操作得到反映。
https://stackoverflow.com/questions/51406033
复制相似问题