<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、【定义】:</span>
只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用。
二、【特征】:
1、它是构造函数的重载。
2、它的参数必须使用同类型对象的引用传递。(思考为什么?)
答:因为如果是普通的值传递的话,则会产生临时变量,调用拷贝构造函数,一直递归下去。而如果是利用引用传递的话,则因为引用就是你此时的实参,所以就不会产生临时变量,执行效率也会大大加快。
3、如果没有显式定义,系统会自动合成一个默认的拷贝构造函数。默认的拷贝构造函数会依次拷贝类的数据成员完成初始化。
三、【在下述三种情况下会调用拷贝构造函数】:
1. 对象以值传递的方式传入函数参数
classCExample
{
private:
int a;
public:
//构造函数
CExample(int b)
{
a = b;
cout<<"creat:"<<a<<endl;
}
//拷贝构造
CExample(const CExample& C)
{
a = C.a;
cout<<"copy"<<endl;
}
//析构函数
~CExample()
{
cout<< "delete:"<<a<<endl;
}
void Show ()
{
cout<<a<<endl;
}
};
//全局函数,传入的是对象
voidg_Fun(CExample C)
{
cout<<"test"<<endl;
}
intmain()
{
CExample test(1);
//传入对象
g_Fun(test);
return 0;
}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
调用g_Fun()时,会产生以下几个重要步骤:
(1).test对象传入形参时,会先会产生一个临时变量;
(2).然后调用拷贝构造函数把test的值给这个临时变量;
(3).等g_Fun()执行完后, 析构掉 这个临时变量。
2. 对象以值传递的方式从函数返回
classCExample
{
private:
int a;
public:
//构造函数
CExample(int b)
{
a = b;
}
//拷贝构造
CExample(const CExample& C)
{
a = C.a;
cout<<"copy"<<endl;
}
void Show ()
{
cout<<a<<endl;
}
};
//全局函数
CExampleg_Fun()
{
CExample temp(0);
return temp;
}
intmain()
{
g_Fun();
return 0;
}
当g_Fun()函数执行到return时,会产生以下几个重要步骤:
(1). 先会产生一个临时变量
(2). 然后调用拷贝构造函数把temp的值给临时变量。
(3). 在函数执行到最后先析构temp局部变量。
(4). 等g_Fun()执行完后再析构掉临时变量对象。
3. 对象需要通过另外一个对象进行初始化;
CExample A(100);
CExample B = A;
// CExample B(A);
后两句都会调用拷贝构造函数。