拷贝构造函数又叫复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。有四个应用场景。
class AA
{
public:
AA() //无参构造函数 默认构造函数
{
cout<<"构造函数被调用"<<endl;
}
AA(int _a) //无参构造函数 默认构造函数
{
a = _a;
}
AA(const AA &obj2)//这里即拷贝构造函数
{
cout<<"拷贝构造函数,通过另外一个对象obj2初始化自己"<<endl;
a = obj2.a + 10;
}
~AA()
{
cout<<"析构函数被调用"<<endl;
}
void getA()
{
printf("a:%d \n", a);
}
protected:
private:
int a;
};
第一个应用场景:
定义变量并初始化
//创建一个全局函数来观察构造和析构函数
void ObjPlay01()
{
AA a1; //变量定义
//赋值构造函数的第一个应用场景
//用对象1 初始化 对象2
AA a2 = a1; //定义变量并初始化,调用拷贝构造函数
a2 = a1; //用a1来=号给a2 编译器提供的浅copy
}
第二个应用场景(也是定义变量并初始化):
//创建一个全局函数来观察构造和析构函数
void ObjPlay02()
{
AA a1(10); //变量定义
//赋值构造函数的第一个应用场景
//我用对象1 初始化 对象2
AA a2(a1); //定义变量并初始化,调用拷贝构造函数
//a2 = a1; //用a1来=号给a2 编译器给我们提供的浅copy
a2.getA();
}
第三个场景:
将对象作为参数传递给全局函数形参,调用两次构造函数和析构函数
void func(AA a1)
{
cout<<a1.getA()<<endl;
}//调用a1的析构函数
void main()
{
AA a;//调用一次构造函数
func(a);//传递实参a,用a初始化形参a1,相当于AA a1 = a;
}//调用a的析构函数
第四个场景:
在全局函数中,把对象作为返回值
AA func()
{
AA temp(100);//调用一次构造函数,创建temp对象
return temp;/*调用一次拷贝构造函数,用temp创建一个匿名对象,当匿名对象接过temp时,析构temp*/
}
void main()
{
AA a1 = func();/*这里是初始化a1,直接接过func返回的匿名对象,不再调用构造函数*/
AA a2;
a2 = func();//这里是给a2赋值,要调用构造函数