当前位置: 首页 > news >正文

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

文章目录

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

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

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

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

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

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

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

在这里插入图片描述

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

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

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

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

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

在这里插入图片描述


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

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

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


3. 构造函数有哪几种

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

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

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


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

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

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

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

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

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

在这里插入图片描述


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

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

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

http://www.lryc.cn/news/435219.html

相关文章:

  • linux中vim介绍以及常用命令大全
  • 线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析
  • CSS“多列布局”(补充)——WEB开发系列35
  • UI自动化测试痛点解决方案
  • 如何将QAD系统EDI模块无缝迁移到知行之桥?
  • Linux学习-ELK(一)
  • Selenium事件监听
  • 视频写作入门:9个步骤开始您的视频日志并与观众建立真实的联系
  • 使用豆包MarsCode 编写 Node.js 全栈应用开发实践
  • Spring Cloud全解析:熔断之Hystrix执行流程
  • 大模型算法岗,面试百问百答,7天3个offer拿到手!
  • 代码随想录算法day32 | 动态规划算法part05 | 完全背包,518. 零钱兑换 II, 377. 组合总和 Ⅳ,70. 爬楼梯 (进阶)
  • 【Linux 从基础到进阶】自动化备份与恢复策略
  • 前端打包装包——设置镜像
  • volatile 的作用?是否具有原子性,对编译器有什么影响?什么情况下一定要用 volatile, 能否和 const 一起使用?
  • iPhone 16分辨率,屏幕尺寸,PPI 详细数据对比 iPhone 16 Plus、iPhone 16 Pro、iPhone 16 Pro Max
  • FunASR搭建语音识别服务和VAD检测
  • 设计一个支持多线程写入的并发日志记录系统:C++实战指南
  • 使用LSTM(长短期记忆网络)模型预测股票价格的实例分析
  • 开源的 Windows 12 网页体验版!精美的 UI 设计、丰富流畅的动画
  • chapter14-集合——(List)——day18
  • Frida 脚本抓取 HttpURLConnection 请求和响应
  • Java实现建造者模式和源码中的应用
  • Windows安装docker
  • SprinBoot+Vue校园车辆管理系统的设计与实现
  • 【C语言进阶】C语言动态内存管理:深入理解malloc、calloc与realloc
  • Java+控制台 图书管理系统
  • gi清除无用缓存
  • 云PLM系统对企业影响有哪些?解析云PLM系统的作用
  • 四、查找算法