有没有一种快速的方法可以在 C++ 中精确复制现有对象?
例如,我有一个默认构造函数,它使大多数变量未初始化,并且这些变量将在稍后的过程中设置。然后我想用已经初始化的所有数据制作该对象的精确副本。
我听说 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)
{}
您必须手动定义复制过程。如果您重复使用相同的资源或想要该资源的副本,编译器怎么知道?
默认的复制构造函数(它始终存在,除非您定义自己的构造函数)将通过简单的赋值复制所有数据,这可能对指针、文件、连接和所有其他外部资源有害。