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

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

文章目录

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

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

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

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

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

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

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

在这里插入图片描述

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

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

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

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

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

在这里插入图片描述


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

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

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


3. 构造函数有哪几种

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

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

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


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

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

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

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

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

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

在这里插入图片描述


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

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

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


http://www.kler.cn/a/299433.html

相关文章:

  • I.MX6ULL 中断介绍上
  • Linux运维之Linux的安装和配置
  • 第一个3D程序!
  • Day52:range()函数
  • Windows系统本地部署deepseek 更改目录
  • 主流的AEB标准有哪些?
  • 深入探索Java中的分布式锁服务与Zookeeper集成
  • 【FastAPI】文件响应方法StreamingResponse和 FileResponse的用法和场景
  • 在IDEA中如何创建web项目?——不使用Archetype
  • DC-DC恒频电流模式3A降压转换器,小体积封装
  • Android生成C++ AIDL
  • FastAPI 深入学习:利用__call__方法实现动态依赖项
  • 【腾讯云】AI驱动的数据库TDSQL-C如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图
  • 自己看---华为od--构成正方形的数量
  • 神经网络的可解释性理论及工具
  • timedatectl /date /hwclock 命令
  • Rust使用之【宏】
  • Vue(7)——工程化开发
  • 基于SpringBoot+Vue的学生成绩管理系统
  • [苍穹外卖]-04菜品管理接口开发
  • Node.js入门与生态全解析:包管理与构建工具详解
  • 从代码层面说算子链断链的方式
  • 【OJ刷题】双指针问题
  • 101 个 React 技巧和窍门
  • TP发邮件的功能如何实现?tp框架发送邮件?
  • 在Ubuntu上部署 Misskey 服务器