C/C++什么时候需要定义一个复制构造函数

1.关于复制构造函数

复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中,类的复制构造函数原型如下:

ClassName(const ClassName &)

注意:这里之所以使用引用,可以有效的防止无限递归的去调用复制构造函数,可以节省调用构造函数的时间以及存储新对象的空间。

2.何时调用复制构造函数

新建一个对对象并将其初始化为同类现有对象时,复制构造函数都将被调用。这在很多情况下都可能发生,最常见的情况是将新对象显式地初始化为现有的对象。下面4种声明都将调用复制构造函数:

(1) CStringBad ditto(motto);
(2) CStringBad metto =motto;
(3) CStringBad also =CStringBad(motto);
(4) CStringBad* pStringBad = new CStringBad(motto);

注意:metto = motto;这种为赋值操作,并不会调用复制构造函数。此外,每当程序生成了对象副本时,编译器都会将使用复制构造函数,具体的说,当函数按值传递对象或函数返回对象时。都会调用复制构造函数。

3.默认复制构造函数的功能

默认复制构造函数逐个复制非静态成员(成员的复制也称为浅拷贝),复制的是成员的值。
浅拷贝仅仅是按值复制的,如果存在成员变量中存在指针,浅拷贝的结果会使得两个指针指向同一个内存空间,当其中一个指针被释放时,会导致另外一个指针指向一块不可用的内存,从而导致异常。

4.定义一个显示的复制构造函数以解决此问题

解决类设计中的这种问题的方法是进行深拷贝,最简单的方法是使用memcpy(),即进行内存复制。

总结:如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数;以复制指向的数据,而不是指针,这被称为深度拷贝。
复制的另二种形式(成员复制或浅拷贝)只是复制指针值。浅复制仅浅浅地复制指针信息,而不会深入“挖掘”以复制指针引用的结构。

你可能感兴趣的:(C/C++基础)