1. 构造函数
构造函数按类型分为普通构造函数和拷贝构造函数。如果一个类的构造函数的第一个参数是该类型的引用,则是拷贝构造函数。
1 | class person{ |
2. 构造函数调用规则
默认情况下,C++编译器至少为一个类添加3个函数
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数(对属性进行值拷贝)
但当用户定义了构造函数,调用规则如下:
- 如果用户定义了有参构造函数,c++则不再提供默认无参构造,但是会提供默认拷贝构造
- 如果用户定义了拷贝构造函数,c++则不再提供默认构造函数,需要用户定义普通构造函数
3. 深拷贝与浅拷贝
- 浅拷贝:在拷贝对象时只拷贝对象的指针,而没有拷贝指针所指向的动态分配的内存内容,新旧对象都指向同一块内存。造成的结果就是当其中一个对象的析构函数被调用时,会释放该内存,从而导致另一个对象访问无效内存,从而引发问题。
- 深拷贝:在拷贝对象时,会复制对象所指向的动态分配的内存,而不只是复制指针本身。这样做可以确保每个对象都有其自己的一份独立的内存副本。
- 总结:浅拷贝只是简单地复制指针,导致多个对象共享同一块内存,容易出现悬空指针或者资源释放问题。深拷贝会为新对象分配内存,并将原对象的数据复制到新内存中,确保每个对象都有独立的内存空间,从而避免了悬空指针或资源释放问题。