对象初始化列表:
构造函数后加 “ :”, 后面接上要初始化的成员,各个成员之间以逗号进行区分
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);
}