文章目录
- 1. 什么是构造函数和析构函数
- 2. 构造函数和析构函数可以是虚函数吗
- 3. 构造函数有哪几种
- 4. 深拷贝和浅拷贝的区别
1. 什么是构造函数和析构函数
🐧 构造函数:
构造函数是在创建对象时自动调用的特殊成员函数。
目的:初始化对象的成员变量,为对象分配资源,执行必要的初始化操作。
特点:
①函数名与类名相同:构造函数的函数名必须与类名相同,且没有返回类型。、
②可以有多个构造函数,一个类可以有多个构造函数,它们可以根据参数类型和数量不同进行重载。
③默认构造函数:如果没有为类定义任何的构造函数,编译器会自动生成一个默认构造函数。默认构造函数没有参数,也可能执行一些默认的初始化操作。
🐧 析构函数:
析构函数是在对象生命周期结束时自动调用的特殊成员函数。
目的:释放对象占用的资源,执行必要的清理操作。
特点:
①函数名和类名相同,前面加上波浪号 ~
②析构函数没有参数,每个类只有一个析构函数,不能重载。
③默认析构函数:如果没有为类定义任何析构函数,编译器会自动生成一个默认析构函数,执行简单的清理操作。
2. 构造函数和析构函数可以是虚函数吗
-
🍎析构函数可以是虚函数。当派生类对象中有内存需要回收时,如果析构函数不是虚函数,不会触发动态绑定,只会调用基类的析构函数,导致派生类资源无法正确释放,造成内存泄露。
-
⚽构造函数不能声明为虚函数,因为虚函数机制依赖于虚函数表来实现运行时的多态性。构造函数是在对象的创建过程中被调用的,在对象的虚函数表未建立前,无法进行虚函数的调用,因此构造函数不能是虚函数。
3. 构造函数有哪几种
-
🐧①默认构造函数
没有任何参数的构造函数。如果用户没有为类定义构造函数,编译器会自动生成一个默认构造函数。默认构造函数用于创建对象时的初始化,当用户不提供初始化值时,编译器将调用默认构造函数。
-
🐧②带参的构造函数
接受一个或多个参数,用于在创建对象时传递初始化值。可以定义多个带参数的构造函数,以支持不同的初始化方式。
-
🐧③拷贝构造函数
用于通过已存在的对象创建一个新对象,新对象是原对象的副本。参数通常是对同类型对象的引用。
4. 深拷贝和浅拷贝的区别
- 🍎主要区别在于如何处理对象内部的动态分配的资源。
深拷贝
深拷贝是对对象的完全独立复制,包括对象内部动态分配的资源。在深拷贝中,不仅复制对象的值,还会复制对象所指向的堆上的数据。
特点:
🐧①复制对象及其所有成员变量的值;
🐧②动态分配的资源也会复制,新对象拥有自己的一份资源副本;
深拷贝通常涉及到手动分配内存,并在拷贝构造函数或赋值操作符中进行资源的复制。
浅拷贝
浅拷贝仅复制对象的值,而不涉及对象内部动态分配的资源。在浅拷贝中,新对象和原对象共享相同的资源,而不是复制一份新的资源。
特点:
🐧①复制对象及其所有成员变量的值;
🐧②对象内部动态分配的资源不会被复制,新对象和原对象共享同一份资源;
浅拷⻉通常使⽤默认的拷⻉构造函数和赋值操作符,因为它们会逐成员地复制原对象的值