基本概念
注意:一个类有且只能有一个
只有一个参数 即对同类对象的引用
形如:x::x(x&) 或 x::x(const x &)
二者选一 后者能以常量对象作为参数
如果没有定义复制构造函数 那么编译器生成默认复制构造函数
默认的复制构造函数完成复制功能
默认复制构造函数 与 默认构造函数的区别(默认的无参构造函数)
要同无参构造函数区别开来
无参构造函数不一定存在
若 自己定义了构造函数 编译器就不会帮你生成 无参构造函数
若 没有定义构造函数 编译器就会帮你自动生成 构造函数
而 默认复制构造函数 一定存在(有点疑惑)如果定义有自己的复制构造函数,则默认的复制函数不存在
(那为还什么说默认复制函数一定存在)
注意 不允许有形如 x::x(x) 的复制构造函数
class CSample
{
CSample(CSample)//参数只能是引用 不能是对象
{
}//错,不允许这样的构造函数
}
复制构造函数起作用的三种情况
(1)当用一个对象去初始化同类的另一个对象时。
//方法一
Comple c2(c1);
//方法二
Comple c2 = c1;//初始化语句 非赋值语句
Comple c1(9), c2;
c2 = c1;//并没有调用复制构造函数 因为c2已经被初始化过了
//c2调用了无参构造函数
(2)如果某函数有一个参数是类A的对象,那么该函数被调用时,类A的复制构造函数将被调用。
void doWork(Person p2)
{
}
void test()
{
Person p;
doWork(p);//在参数传递的过程中 会调用p2的复制构造函数
}
(3)如果函数的返回值是类A的对象时,则函数返回时,A的复制构造函数被调用。
Person doWork()
{
Person p1;
return p1;//调用的并不是p1的复制构造函数 而是临时变量的复制构造函数
}
void test()
{
Person p = dowork();
}