拷贝构造函数
拷贝构造函数:用一个已存在的对象给另一个正在生成的对象初始化的时候自动调用的成员方法
- 拷贝构造函数被调用的场景有哪些?
(1)用 = 定义变量时会调用拷贝构造
(2)将一个对象作为实参传递给一个非引用类型的形参,值传递 func(p2);会调用拷贝构造函数,按照参数的值构造一个临时对象,临时对象仅在该函数执行时存在,函数调用结束后,会自动调用析构函数。引用传递和指针传递是不会调用拷贝构造函数的
(3)从一个返回类型为非引用类型的函数返回一个对象,return p1;
(4)用花括号列表初始化一个数组中的元素或者一个聚合类中的成员
如果没有自己实现,会自动生成一个浅拷贝的拷贝构造(影响堆上内存=>指针)
如果自己实现,就不会生成
注意:
- 拷贝构造要防止浅拷贝
- 拷贝构造函数一定要传引用,防止死递归
Person(const Person& src)
{
cout << "Person(const Person& src)" << endl;
_age = src._age;
_sex = src._sex;
_name = new char[strlen(src._name) + 1];
memset(_name,0, strlen(src._name) + 1);
for (int i = 0; i < strlen(src._name); i++)
{
_name[i] = src._name[i];
}
}