2

有没有一种快速的方法可以在 C++ 中精确复制现有对象?

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

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

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

4

4 回答 4

1

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

但是,不要忘记,一旦您选择实现复制构造函数,这表明您很可能需要实现复制赋值运算符以及析构函数。这通常被称为C++中的三原则。

于 2013-03-27T17:43:15.147 回答
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_;
};

参见: 三法则

于 2013-03-27T17:45:46.357 回答
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)
{}

在此处查看其他示例

于 2013-03-27T17:44:24.080 回答
0

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

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

于 2013-03-27T17:45:49.223 回答