C ++中的克隆对象与完全重复(构建后的数据集)

时间:2013-03-27 17:38:39

标签: c++ copy clone

有没有一种快速的方法可以在C ++中创建一个exisitng对象的精确副本?

例如,我有一个默认构造函数,它将大多数变量保持为未初始化,并且这些变量将在稍后的过程中设置。然后我想用已经初始化的所有数据制作该对象的精确副本。

我听说c ++中有一个复制构造函数,但我不知道如何使用它,也不知道它是否适合我的情况。除了手动复制所有数据之外,还有一种方便的方法吗?

修改 我在这个对象中有很多用户定义的类型(图形等复杂的东西)

4 个答案:

答案 0 :(得分:1)

您需要使用复制构造函数。如果你没有实现,编译器会为你提供一个默认的。如果有成员无法按值复制(比如动态分配的指针),最好自己实现它,并确保创建深层副本。

但是,不要忘记,一旦您选择实现复制构造函数,它就表明您很可能需要实现复制赋值运算符和析构函数。这通常称为C ++中的Rule of the three

答案 1 :(得分:1)

如果你的成员是POD类型,或者它们本身是可复制的,那么编译器将生成一个默认的复制构造函数。

class Foo
{
public:
   Foo(int x, int y, int z, const std::string& name)
      : x_(x), y_(y), z_(z), name_(name)
   {
   }

private:
   int x_, y_, z_;
   std::string name_;
};

此示例类可使用默认复制构造函数进行复制。以下都是正确的:

Foo a(1, 2, 3, "four");

// copy construct b from a, using the compiler provided default copy constructor
Foo b(a);

Foo c(5, 6, 7, "eight");

// copy c from b, c's current values are "lost"    
c = b;

如果您的类包含用户定义的类型,这些类型不能按预期执行浅拷贝,那么您将需要编写自己的拷贝构造函数,赋值运算符和析构函数。这就是为什么大多数有经验的C ++开发人员会尽可能远离原始指针(和其他类似概念)。

class BadFoo
{
public:
   BadFoo() : x_(new int(5))
   {
   }

   // ... You need to manage the memory of x_ on your own
   // This means following the rule of 3 (C++03) or 5 (C++11)

private:
   int* x_;
};

请参阅:Rule of Three

答案 2 :(得分:0)

复制构造函数是可行的方法。

class MyObject
{
    public:
        MyObject(const MyObject& other);    
    private:
        int x;
        float y;
        std::string s;
}
MyObject::MyObject(const MyObject& other)
    : x(other.x), y(other.y), s(other.s)
{}

see other examples here

答案 3 :(得分:0)

您必须手动定义复制过程。如果您重新使用相同的资源或想要该资源的副本,编译器还能知道什么呢?

默认的复制构造函数(除非您定义自己的构造函数,否则它将始终存在)将通过简单赋值复制所有数据,这可能对指针,文件,连接和所有其他外部资源有害。