有没有一种快速的方法可以在C ++中创建一个exisitng对象的精确副本?
例如,我有一个默认构造函数,它将大多数变量保持为未初始化,并且这些变量将在稍后的过程中设置。然后我想用已经初始化的所有数据制作该对象的精确副本。
我听说c ++中有一个复制构造函数,但我不知道如何使用它,也不知道它是否适合我的情况。除了手动复制所有数据之外,还有一种方便的方法吗?
修改 我在这个对象中有很多用户定义的类型(图形等复杂的东西)
答案 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)
{}
答案 3 :(得分:0)
您必须手动定义复制过程。如果您重新使用相同的资源或想要该资源的副本,编译器还能知道什么呢?
默认的复制构造函数(除非您定义自己的构造函数,否则它将始终存在)将通过简单赋值复制所有数据,这可能对指针,文件,连接和所有其他外部资源有害。