對象初始化列表、深拷貝

對象初始化列表:
構造函數後加 “ :”, 後面接上要初始化的成員,各個成員之間以逗號進行區分

Test(int a, int b): m_a(),m_b(b)
{}

1、對象初始化列表的執行要優先於 構造函數
2、對象的初始化順序和對象在初始化列表中所在位置無關,和在類中的聲明順序有關

拷貝構造: 類型(const 類名& 變量名)

Test(const Test &obj)     // 拷貝構造函數  賦值構造函數
    {
        m_a = obj.m_a;
        printf ("拷貝構造被調用\n");
    }


Test t = 10;

Test t1 = t;
t1.show();

// 賦值操作   t1已經存在,
t1 = t;    //這裏不會調用構造函數    和對象初始化進行區分

// 函數參數是對象的時候,實參到形參的傳遞會調用拷貝構造 ==> 建議使用引用
void func(Test &obj){}

// 對象作爲返回值的時候,也會調用拷貝構造函數 
// ===>  不同的編譯對函數返回值處理方式可能不同
Test func()
{
    Test t = 10;
    return t;
}

當類中沒有拷貝構造的時候,系統會添加一個拷貝構造,進行 “值” 的複製 ====> 淺拷貝過程
深拷貝:複製的時候連同 堆上的空間一起復制 ====> 自己寫
當成員變量中存在指針的時候,要進行深拷貝

Test1(const Test1 &obj)//拷貝構造函數
    {
        m_a = obj.m_a;
        m_b = obj.m_b;
        m_pa = new int;
        *m_pa = *(obj.m_pa);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章