一、拷贝构造函数概述
拷贝构造函数是一种特殊的构造函数。当用同一类的一个对象去初始化另外一个对象时,就会调用拷贝构造函数。拷贝构造函数通常用于创建一个新对象,它初始化为另一个同类对象的副本。
//拷贝构造函数的定义
ClassName(const ClassName &obj) {
// 对象定义
}
二、浅拷贝和深拷贝
在使用拷贝构造函数时,需要注意浅拷贝和深拷贝的问题。
浅拷贝仅仅是拷贝指针,因此两个对象的指针指向同一个内存空间,如果其中一个对象发生了改变,另一个对象的值也会跟着改变,这样会产生很多意想不到的问题。
深拷贝会将对象的值复制一份到新的内存地址中,因此两个对象的值不会相互影响。
//浅拷贝的实现
ClassName(const ClassName &obj) {
ptr = obj.ptr;
}
//深拷贝的实现
ClassName(const ClassName &obj) {
ptr = new int;
*ptr = *obj.ptr;
}
三、调用拷贝构造函数的情况
以下是调用拷贝构造函数的典型情况:
- 使用同一类的对象来初始化新对象。
- 值传递的方式给函数参数传值。
- 函数返回一个对象。
四、拷贝构造函数在类继承中的应用
在类的继承中,如果派生类没有定义自己的拷贝构造函数,那么会调用基类的拷贝构造函数。
//基类构造函数的定义
BaseClass(const BaseClass &obj) {
// 对象定义,注意是基类对象
}
//派生类的定义
DerivedClass(const DerivedClass &obj) : BaseClass(obj) {
// 派生类对象初始化
}
五、拷贝构造函数的注意事项
- 拷贝构造函数的参数应该是常量引用。
- 拷贝构造函数应该是公有的。
- 拷贝构造函数不应该递归调用。
- 拷贝构造函数的实现应该考虑浅拷贝和深拷贝的问题。
六、完整代码示例
// 拷贝构造函数示例代码
#include<iostream>
using namespace std;
class Example {
public:
int *ptr;
Example(int i) {
ptr = new int(i);
}
~Example() {
delete ptr;
}
// 拷贝构造函数的定义
Example(const Example &obj) {
ptr = new int;
*ptr = *obj.ptr;
cout << "调用拷贝构造函数" << endl;
}
};
void display(Example obj) {
cout << "obj的值为 " << *obj.ptr << endl;
}
int main() {
Example obj1(10);
display(obj1);
Example obj2 = obj1; //调用拷贝构造函数
cout << "obj2的值为 " << *obj2.ptr << endl;
return 0;
}