【C++】拷贝构造
一种特殊的构造函数,用自身这种类型来构造自身
Student stu1;
Student stu2=stu1;//调用拷贝构造
- 如果类中没有自定义拷贝构造,类中会自动提供一个默认拷贝构造
- 如果类中定义了自定义拷贝构造,类中不会提供默认拷贝构造
自定义拷贝构造
类名(const 类名& 引用名){}
const 是为了防止被更改
示例:
class Student{
int id;
public:
Student(const student& stu){
this->id = stu.id;
}
}
this->id
看不懂的先看:【C++】this指针
拷贝构造的调用
(1)
Student stu1;
Student stu2=stu1;//隐式调用拷贝构造
Student stu3(stu2);//显式调用拷贝构造
Student *stup=new Student(stu3);
(2)在函数传参时,函数的形参是类对象:void fun(Student stu){}
fun(stu1);//在函数调用传参时调用拷贝构造
(3)如果一个函数的返回值类型是对象,在函数调用结束,返回对象的时候调用拷贝构造
Student fun1(Student stu){return stu;}
这里在函数调用的时候会调用两次拷贝构造,函数传参一次,函数返回时一次
默认拷贝构造不会重新给指针开辟内存,这种形式称为“浅拷贝”;会造成重复释放动态内存问题(两个指针的地址指向同一个内存)
如果类中成员有开辟动态内存的,就要重写拷贝构造,给新对象的指针重新开辟动态内存,这种形式称为“深拷贝”
示例:
#include<iostream>
class Student {
char* name;
public:
Student(){}
Student(char* name) {
this->name = new char[strlen(name) + 1];
strcpy_s(this->name, strlen(name) + 1, name);
}
Student(const Student& stu) {
this->name = new char[strlen(stu.name) + 1];
strcpy_s(this->name, strlen(stu.name) + 1, stu.name);
}
void callName() {
std::cout << this->name << std::endl;
}
};
int main() {
char arr[] = "Root";
char* ptr = arr;
Student stu1(ptr);
stu1.callName();
Student stu2(stu1);
stu2.callName();
}
如果2个程序单元(例如2个函数)是通过拷贝它们所共享的数据的指针来工作的,这就是浅拷贝;因为真正要访问的数据并没有被拷贝。
如果被访问的数据被拷贝了,在每个单元中都有自己的一份,对目标数据的操作相互不受影响,则叫做深拷贝。
原文地址:https://blog.csdn.net/qq_45951891/article/details/143889051
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!