在C ++中深度复制

时间:2015-01-02 06:32:28

标签: c++ deep-copy

在C ++中考虑两种情况,

  1. 通过引用返回对象。
  2. 原样归还对象。
  3. 在上述哪种情况下进行深度复制,为什么?

    提前致谢。

2 个答案:

答案 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)

如果一个对象有指向动态分配内存的指针,并且在复制原始对象时需要复制动态分配的内存,则需要深层复制。

需要深拷贝的类通常需要:

  1. 要进行初始分配或将指针设置为NULL的构造函数。
  2. 用于删除动态分配的内存的析构函数。
  3. 复制构造函数,用于复制动态分配的内存。
  4. 重载的赋值运算符,用于复制动态分配的内存。
  5. 要制作深层副本,您必须编写一个复制构造函数并重载赋值运算符,否则副本将指向原始副本,并带来灾难性后果。

    请阅读此内容以获取更多信息 - Shallow vs. deep copyingHow and When to Make Deep Copies in C++