1.构造函数(Constructor):
构造函数是一种特殊的成员函数,用于创建对象时初始化对象的数据成员。构造函数与类名相同,没有返回类型,并且可以有参数。在创建类的新对象时,构造函数会自动调用。构造函数可以用于执行必要的初始化操作,为对象分配内存,并将对象的成员变量设置为默认值。
class MyClass {
public:
// 默认构造函数
MyClass() {
// 执行初始化操作
}
// 带参数的构造函数
MyClass(int value) {
// 执行初始化操作
}
};
// 创建对象并调用构造函数
MyClass obj1; // 调用默认构造函数
MyClass obj2(10); // 调用带参数的构造函数
2.析构函数(Destructor):
析构函数是类的特殊成员函数,用于在对象销毁时进行清理和释放资源。析构函数的名称与类名相同,前面加上波浪号(~)作为前缀。它不带参数,没有返回类型,并且只能有一个析构函数。当对象的生命周期到达结束点时(例如,离开作用域、删除对象或程序结束),析构函数会自动调用。
class MyClass {
public:
// 构造函数
// 析构函数
~MyClass() {
// 执行清理和资源释放操作
}
};
// 创建对象并调用析构函数
void someFunction() {
MyClass obj; // 调用构造函数
// 执行一些操作
// obj 离开作用域,析构函数自动调用
}
3.拷贝构造函数(Copy Constructor):
拷贝构造函数是一种特殊的构造函数,用于从同类对象创建新对象时进行初始化。拷贝构造函数通常以参数为同类对象的引用方式定义。它负责将已有对象的值复制到新对象中,以创建新的独立副本。
拷贝构造函数用于从同类对象创建新对象时进行初始化。它通过复制已有对象的值来创建新的独立副本。通常,拷贝构造函数以参数为同类对象的引用方式定义。
class MyClass {
public:
// 构造函数
// 拷贝构造函数
MyClass(const MyClass& other) {
// 执行拷贝初始化操作
}
};
// 创建对象并调用拷贝构造函数
MyClass obj1; // 调用构造函数
MyClass obj2(obj1); // 调用拷贝构造函数
浅拷贝
浅拷贝(Shallow Copy)是在对象拷贝过程中用于处理指针成员或动态分配资源的两种不同方式。
浅拷贝是一种简单的拷贝方式,它仅复制指针成员的地址,而不是复制指针指向的实际数据。这意味着原始对象和拷贝对象将共享相同的内存块。如果其中一个对象修改了共享的数据,另一个对象也会受到影响。这可能导致意外的行为和资源管理问题。
class ShallowCopyExample {
private:
int* data;
public:
ShallowCopyExample(int value) {
data = new int(value);
}
// 浅拷贝构造函数
ShallowCopyExample(const ShallowCopyExample& other) {
data = other.data; // 仅复制指针地址
}
~ShallowCopyExample() {
delete data;
}
};
深拷贝
深拷贝(Deep Copy)是一种更复杂的拷贝方式,它会为新对象分配独立的内存,并将原始对象指针所指向的数据进行复制。这样,原始对象和拷贝对象将拥有各自独立的内存块,彼此之间不会相互影响。
class DeepCopyExample {
private:
int* data;
public:
DeepCopyExample(int value) {
data = new int(value);
}
// 深拷贝构造函数
DeepCopyExample(const DeepCopyExample& other) {
data = new int(*other.data); // 复制指针指向的数据
}
~DeepCopyExample() {
delete data;
}
};
在进行深拷贝时,需要正确处理动态分配的资源(如指针指向的内存块),并在析构函数中释放相关资源,以避免内存泄漏。
特点:
- 对象中含有指针类型的成员变量时需要用深拷贝构造,否则用浅拷贝构造。
- 编译器默认的拷贝构造函数是浅拷贝构造函数。
- 如果对象中含有指针变量却使用了浅拷贝构造,那么会导致两个指针变量指向同一块地址空间,那么在对象释放时会导致一块空间释放两次,编译器报错。
- 浅拷贝和深拷贝的区别在于两个指针变量指向的是一块空间还是指向不同的空间。如果没有创建内存的操作就是浅拷贝,否则是深拷贝。