C++拷贝构造函数的深拷贝与浅拷贝

一、什么时候调用拷贝构造函数

1. 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值。 
2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。 
3. 当函数的返回值是类对象时,系统自动调用拷贝构造函数

如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝。

二、深拷贝和浅拷贝的区别

1.在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝构造函数——即浅拷贝。当数据成员中没有指针时,浅拷贝是可行的;但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致内存泄漏,程序崩溃。

2.深拷贝会在堆内存中另外申请空间来储存数据,因此当数据成员中有指针时,必须要用深拷贝。

3.简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!

猜你喜欢

转载自blog.csdn.net/jan301/article/details/80186534