拷貝構造函數又叫複製構造函數,是一種特殊的構造函數,它由編譯器調用來完成一些基於同一類的其他對象的構建及初始化。有四個應用場景。
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賦值,要調用構造函數