對象初始化列表:
構造函數後加 “ :”, 後面接上要初始化的成員,各個成員之間以逗號進行區分
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);
}