对象初始化列表、深拷贝

对象初始化列表:
构造函数后加 “ :”, 后面接上要初始化的成员,各个成员之间以逗号进行区分

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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章