[讨论]探讨 深拷贝与浅拷贝的问题
这两种拷贝的区别都在哪些具体的情况下要用到深拷贝呢
有一点是肯定的,就是在有堆内存空间分配的时候肯定需要
to : cpluslover
当我们创建一个类时,如果不显式定义复制构造函数(copy constructor),那么编译器会为我们提供一个合成复制构造函数。1,那么合成复制构造函数做了些什么?2,我们在什么情况下需要定义自己的构造函数呢?
1,合成复制构造函数的行为是,逐个成员初始化,将新对象初始化为原来的副本。(也就是浅拷贝)
struct A{
int x;
int y;
};
A a = {1,2};
A a2(a); //这里将调用合成复制构造函数,将新对象a2的成员逐个初始化为1,2
2,当用上述方法不能满足复制的要求时,比如,有个数据成员是指针,或者在创建新对象时必须做一些特定的工作,就要定义自己的复制构造函数。我们指定复制构造函数的行为满足我们的需要。(也就是深拷贝)
可以使用合成构造函数的地方也可以使用合成赋值操作符(assighment operator),可以把他们看成一个单元,需要其中一个,则几乎肯定需要另一个。
当用到自身定义的析够函数(destructor)时,说明对象在创建时分配了资源(例如动态内存),需要一个操作自动回收。所以,当类需要析够函数时,它也一定需要复制构造函数和赋值操作符。
这相当于一个经验法则吧,这三者也称为复制控制成员!