一种特殊的构造函数,用自身这种类型来构造自身
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个函数)是通过拷贝它们所共享的数据的指针来工作的,这就是浅拷贝;因为真正要访问的数据并没有被拷贝。
如果被访问的数据被拷贝了,在每个单元中都有自己的一份,对目标数据的操作相互不受影响,则叫做深拷贝。