拷貝構造函數應用場景分析

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

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賦值,要調用構造函數
發佈了36 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章