0%

拷贝构造函数

1. 构造函数

构造函数按类型分为普通构造函数拷贝构造函数。如果一个类的构造函数的第一个参数是该类型的引用,则是拷贝构造函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class person{
public:
int score;
//无参构造函数
person(){
score = 0;
}
//有参构造函数
person(int score){
this->score = score;
};
//拷贝构造函数
person(const person& p){
this->name = p.name;
}
string getName();
};


//调用有参构造函数
person p1(100);
//调用拷贝构造函数
person p2(p1);
person p3 = p1;

2. 构造函数调用规则

默认情况下,C++编译器至少为一个类添加3个函数

​ 1.默认构造函数(无参,函数体为)

​ 2.默认析构函数(无参,函数体为空)

​ 3.默认拷贝构造函数(对属性进行值拷贝)

但当用户定义了构造函数,调用规则如下:

  • 如果用户定义了有参构造函数,c++则不再提供默认无参构造,但是会提供默认拷贝构造
  • 如果用户定义了拷贝构造函数,c++则不再提供默认构造函数,需要用户定义普通构造函数

3. 深拷贝与浅拷贝

  • 浅拷贝:在拷贝对象时只拷贝对象的指针,而没有拷贝指针所指向的动态分配的内存内容,新旧对象都指向同一块内存。造成的结果就是当其中一个对象的析构函数被调用时,会释放该内存,从而导致另一个对象访问无效内存,从而引发问题。
  • 深拷贝:在拷贝对象时,会复制对象所指向的动态分配的内存,而不只是复制指针本身。这样做可以确保每个对象都有其自己的一份独立的内存副本。
  • 总结:浅拷贝只是简单地复制指针,导致多个对象共享同一块内存,容易出现悬空指针或者资源释放问题。深拷贝会为新对象分配内存,并将原对象的数据复制到新内存中,确保每个对象都有独立的内存空间,从而避免了悬空指针或资源释放问题。