在很多情况下,C++程序都需要复制一个变量,例如按值传递参数的时候,或者返回非引用、非指针的返回值的时候。在这些情况下,如果变量是基本数据类型,编译器会直接复制变量的值到新的临时变量中去;而如果变量是类对象,编译器就会使用现有对象的成员数据重新构造出一个临时对象,这样的构造函数就叫作复制构造函数(Copy Constructor)。我们先来看一个示例:
动手写9.1.1
动手写9.1.1展示了复制构造函数的语法和使用场景。运行结果如图9.1.1所示:
图9.1.1 复制构造函数
在本示例中,我们可以看到MyClass的复制构造函数一共被调用了6次:
◇ 第一次是对myclass1传参的显式调用。
◇ 第二次发生在test函数体之前,也就是按值传参的时候。(www.xing528.com)
◇ 第三次发生在test函数体调用结束之前,也就是按值返回的时候。
◇ 最后3次发生在使用初始化列表初始化数组的时候,每一个元素的初始化都调用了一次复制构造函数(对vector等容器也适用)。
这些基本覆盖了系统自动调用复制构造函数的大多数情况。
我们接着来看复制构造函数的语法。在MyClass中复制构造函数的参数类型是“const MyClass &myclass”,可为什么是const呢?这是因为复制并不需要改变原来的对象,我们只是拿它当作范本而已,所以这里用const来防止程序员意外修改原值。那又为什么是引用呢?我们可以从以下示例中看看使用按值传参会发生什么。
动手写9.1.2
如动手写9.1.2展示的那样,按值传参的复制构造函数会导致出现如图9.1.2所示的编译错误:
图9.1.2 复制构造函数按值传参
这样的结果是很好理解的。因为按值传参的复制构造函数在参数传递的时候会再次调用复制构造函数,也就是说如果复制构造函数是按值传参就会无限循环下去。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。