在C ++中考虑两种情况,
在上述哪种情况下进行深度复制,为什么?
提前致谢。
答案 0 :(得分:1)
通过引用返回对象时,不会复制对象。
按值返回对象时,将进行复制。这是浅拷贝还是深拷贝取决于拷贝构造函数。
示例1
简单struct
:
struct Point
{
double x;
double y;
double z;
};
您不需要为此类struct
实施复制构造函数。编译器将为它生成正确工作的复制构造函数。
示例2
struct Edge;
struct Vertex
{
std::list<Edge*> edges;
};
对于Vertex
,编译器生成的复制构造函数将复制Edges
的列表。发生这种情况是因为std::list
的复制构造函数进行了深层复制。然而,深拷贝在那里结束。在制作Edge
的副本时,它不会创建新的Vertex
个对象。如果这还不够,您必须为Vertex
实施一个复制构造函数,并根据您的需要做正确的事情。
答案 1 :(得分:0)
如果一个对象有指向动态分配内存的指针,并且在复制原始对象时需要复制动态分配的内存,则需要深层复制。
需要深拷贝的类通常需要:
要制作深层副本,您必须编写一个复制构造函数并重载赋值运算符,否则副本将指向原始副本,并带来灾难性后果。
请阅读此内容以获取更多信息 - Shallow vs. deep copying和How and When to Make Deep Copies in C++