复制构造函数

复制建构子(英语: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);

调用复制构造函数的情形包括:

  1. 用一个对象来初始化正在构造的对象变量;
  2. 函数返回一个对象;
  3. 函数参数作为对象传值;
  4. 抛出一个异常对象;
  5. 捕捉一个异常对象;
  6. 对象放在大括号中,即{ }。

上述情形未必会调用复制构造函数。因为C++标准允许编译器实现做一些优化。例如:

Class X b=X();

Microsoft Visual C++ 2010编译器仅执行了一次缺省构造函数,没有执行复制构造函数。

注释

编辑
  1. ^ 隐性的复制建构子,英语:implicit copy constructor,由编译器自动建立的复制建构子
  2. ^ 显性的复制建构子,英语:explicit copy constructor,由程式设计师自行编写的复制建构子

参考资料

编辑

相关条目

编辑