拷贝构造函数
注意:访问权限是public
拷贝构造函数:类名(const 类名& 对象名){} 可以有多个参数 。 没有常引用就是普通构造函数
如果不写,编译器自己会给一个(作用仅仅是赋值,默认拷贝构造函数一直都在)
#include<iostream>
using namespace std;
class person {
public:
int age;
string name;
person(int age,string name):age(age),name(name) {
cout << "含参构造函数" << endl;
}
person(const person& p) {
age = p.age;
name = p.name;
cout << "拷贝构造函数" << endl;
}
void show() {
cout << "姓名:" << name << " | 年龄:" << age << endl;
}
~person() { cout << "析构函数" << endl; }
};
int main()
{
person p1(100,"xxx");
person p2(p1); //p2=p1 效果一样
p1.show();
p2.show();
return 0;
}
函数值传递过程中会调用拷贝构造函数,因为函数形参本身就是一份赋值
void f(person p) {
p.show();
}
person p;
f(p);
函数以值的方式返回对象时,可能会调用拷贝构造函数(vs会,linux不会,g++做了优化)
person f(person p)
{
person pf(p);
return pf;
}
person p(1, "sdf");
person p2 = f(p);
p2.show();
深浅拷贝
对空指针解引用是非法的
#include<iostream>
using namespace std;
class person {
public:
int a;
int* p;
person()
{
a = 0; p = nullptr;
cout << "person构造函数" << endl;
}
person(const person& per)
{
a = per.a;
//p = per.p; //浅拷贝
//深拷贝
p = new int; //分配内存
*p = *per.p; //拷贝数据
cout << "person拷贝构造函数" << endl;
}
~person() //浅拷贝问题:p1和p2指向同一个空间,p1销毁后,到p2销毁就会崩溃
{
delete p;
p = nullptr;
cout << "person析构函数" << endl;
}
void show()
{
cout << a << " " << p << " " << *p << endl;
}
};
int main()
{
person p1;
p1.a = 10; p1.p = new int(2);
p1.show();
person p2(p1);
p2.show();
return 0;
}