您的位置:首页 > 文旅 > 美景 > 【C++ 面试题】构造函数和析构函数你了解多少呢?

【C++ 面试题】构造函数和析构函数你了解多少呢?

2024/12/23 9:37:36 来源:https://blog.csdn.net/Hou_lang_LJ/article/details/142123402  浏览:    关键词:【C++ 面试题】构造函数和析构函数你了解多少呢?

文章目录

      • 1. 什么是构造函数和析构函数
      • 2. 构造函数和析构函数可以是虚函数吗
      • 3. 构造函数有哪几种
      • 4. 深拷贝和浅拷贝的区别

1. 什么是构造函数和析构函数

🐧 构造函数
构造函数是在创建对象时自动调用的特殊成员函数

目的:初始化对象的成员变量,为对象分配资源,执行必要的初始化操作。

特点
①函数名与类名相同:构造函数的函数名必须与类名相同,且没有返回类型。、

②可以有多个构造函数,一个类可以有多个构造函数,它们可以根据参数类型和数量不同进行重载。

③默认构造函数:如果没有为类定义任何的构造函数,编译器会自动生成一个默认构造函数。默认构造函数没有参数,也可能执行一些默认的初始化操作。

在这里插入图片描述

🐧 析构函数
析构函数是在对象生命周期结束时自动调用的特殊成员函数。

目的:释放对象占用的资源,执行必要的清理操作。

特点
①函数名和类名相同,前面加上波浪号 ~

②析构函数没有参数,每个类只有一个析构函数,不能重载。

③默认析构函数:如果没有为类定义任何析构函数,编译器会自动生成一个默认析构函数,执行简单的清理操作。

在这里插入图片描述


2. 构造函数和析构函数可以是虚函数吗

  • 🍎析构函数可以是虚函数。当派生类对象中有内存需要回收时,如果析构函数不是虚函数,不会触发动态绑定,只会调用基类的析构函数,导致派生类资源无法正确释放,造成内存泄露。

  • ⚽构造函数不能声明为虚函数,因为虚函数机制依赖于虚函数表来实现运行时的多态性。构造函数是在对象的创建过程中被调用的,在对象的虚函数表未建立前,无法进行虚函数的调用,因此构造函数不能是虚函数。


3. 构造函数有哪几种

  • 🐧①默认构造函数
    没有任何参数的构造函数。如果用户没有为类定义构造函数,编译器会自动生成一个默认构造函数。默认构造函数用于创建对象时的初始化,当用户不提供初始化值时,编译器将调用默认构造函数。
    在这里插入图片描述

  • 🐧②带参的构造函数
    接受一个或多个参数,用于在创建对象时传递初始化值。可以定义多个带参数的构造函数,以支持不同的初始化方式。
    在这里插入图片描述

  • 🐧③拷贝构造函数
    用于通过已存在的对象创建一个新对象,新对象是原对象的副本。参数通常是对同类型对象的引用。
    在这里插入图片描述


4. 深拷贝和浅拷贝的区别

  • 🍎主要区别在于如何处理对象内部的动态分配的资源。

深拷贝
深拷贝是对对象的完全独立复制,包括对象内部动态分配的资源。在深拷贝中,不仅复制对象的值,还会复制对象所指向的堆上的数据。

特点:
🐧①复制对象及其所有成员变量的值;

🐧②动态分配的资源也会复制,新对象拥有自己的一份资源副本;

深拷贝通常涉及到手动分配内存,并在拷贝构造函数或赋值操作符中进行资源的复制。

在这里插入图片描述


浅拷贝
浅拷贝仅复制对象的值,而不涉及对象内部动态分配的资源。在浅拷贝中,新对象和原对象共享相同的资源,而不是复制一份新的资源。

特点
🐧①复制对象及其所有成员变量的值;
🐧②对象内部动态分配的资源不会被复制,新对象和原对象共享同一份资源;

浅拷⻉通常使⽤默认的拷⻉构造函数和赋值操作符,因为它们会逐成员地复制原对象的值
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com