以下情况的时候会用到拷贝构造函数:
1) 以值传递给函数传入参数;
2) 以值传递方式从函数体返回;
如果类中没有定义拷贝构造函数,则编译器会自动合成一个拷贝构造函数,该拷贝构造函数完成对象之间的位拷贝,位拷贝又称浅拷贝;
浅拷贝和深拷贝:
某些情况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象的值完全复制给另一个对象A=B; 这时,如果B中有个
成员变量指针已经申请了内存,那A中的那个成员变量也指向了同一块内存。 这样就出现了问题,假如B把内存释放了(如:B析构);
这时候A中的那个指针就成了裸指针,会发生运行错误。
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,在发生复制的时候重新分配资源了,这个过程就是深拷贝;
如果并未复制资源则是浅拷贝。
深拷贝,都是需要用户自己定义的,再有资源的时候必须自己定义深拷贝。
浅拷贝,编译器自动生成的。
1) 以值传递给函数传入参数;
2) 以值传递方式从函数体返回;
3) 一个对象需要通过另一个对象进行初始化。
4) 一个对象作为其他的类成员,而它所在的类会有拷贝构造的行为。
如果类中没有定义拷贝构造函数,则编译器会自动合成一个拷贝构造函数,该拷贝构造函数完成对象之间的位拷贝,位拷贝又称浅拷贝;
浅拷贝和深拷贝:
某些情况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象的值完全复制给另一个对象A=B; 这时,如果B中有个
成员变量指针已经申请了内存,那A中的那个成员变量也指向了同一块内存。 这样就出现了问题,假如B把内存释放了(如:B析构);
这时候A中的那个指针就成了裸指针,会发生运行错误。
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,在发生复制的时候重新分配资源了,这个过程就是深拷贝;
如果并未复制资源则是浅拷贝。
深拷贝,都是需要用户自己定义的,再有资源的时候必须自己定义深拷贝。
浅拷贝,编译器自动生成的。