用完全复制的c++克隆对象(构造后的数据集)

Cloning object in C++ with exactly duplication (data set after construction)

本文关键字:数据集 对象 复制 c++      更新时间:2023-10-16

是否有一种快速的方法来制作c++中现有对象的精确副本?

例如,我有一个默认构造函数,它保留了大多数未初始化的变量,这些变量将在稍后的过程中设置。然后我要复制那个对象所有数据都已经初始化了。

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

编辑:

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

如果你的成员是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_;
};

参见:三人规则

您需要使用复制构造函数。如果您不实现,编译器将为您提供一个默认的。如果存在不能按值复制的成员(如动态分配的指针),最好自己实现,并确保创建深度拷贝。

但是,不要忘记,一旦选择实现复制构造函数,这就意味着很可能需要实现复制赋值操作符和析构函数。

复制构造函数是可行的。

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)
{}

参见此处的其他示例

您必须手动定义复制过程。否则编译器如何知道,如果您正在重用相同的资源或想要该资源的副本?

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