如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。默认的拷贝构造函数是浅拷贝,会造成内存泄漏。
解释
本质上就是构造函数(特殊),用一个已有的对象整体初始化新的对象
如
student s1(01,"zz",18);//比如你创建了一个学生对象s1 学号是01 名字是zz 年龄是18
//这时候你调用构造函数 完成了对象s1的初始化
student s2;
s2 = s1;
//创建了对象s2 但是没有初始化,然后通过s1初始化s2
调用时机
- 对象以值传递的方式传入函数参数;
- 对象以值传递的方式从函数返回;
- 对象通过另外一个对象进行初始化。
分类
浅拷贝:只是对对象进行简单的赋值,拷贝后两个指针指向同一个内存空间,会使析构函数释放两次。
深拷贝:在对含有指针成员的对象进行初始化的时候,必须使用自己定义的拷贝构造函数(创建一个private的拷贝构造函数),使拷贝后的指针成员有自己的内存空间。
//写学生类的拷贝构造函数
student(const student &s)
{
this->name = new chat[strlen(s.name)+1];
strcpy(this->name,s.name);
}
最后:对象的赋值和复制有什么区别?应用场景是怎么样的?