自动驾驶-机器人-slam-定位面经和面试知识系列03之C++STL面试题(01)

这两天有点忙耽搁了,抱歉!!!

这个博客系列会分为C++ STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新,基本涵盖了自己秋招历程被问过的面试内容(除了实习和学校项目相关的具体细节)。在知乎和牛客(牛客上某些文章上会附上内推码)也会同步更新,全网同号(lonely-stone或者lonely_stone)。
关于高频面试题和C++ STL面经,每次我会更新10个问题左右,每次更新过多,害怕大家可能看了就只记住其中几个点。(在个人秋招面试过程中,面试到后面,发现除了个人项目和实习经历外,个人所记录的内容基本能涵盖面试官能问到的)
(另外个人才疏学浅,如果所分享知识中出现错误,请大家指出,避免误导其他人)

虚函数相关

1. 虚函数与多态

  • 虚函数和多态虚函数主要解决了什么问题?
    • 虚函数主要是用来实现多态和多重继承的,没有虚函数理论上也可以实现多态,但比较麻烦
    • 虚函数的目的是在基类指针指向派生类的时候还能正确调用跑派生类中实现的功能
  • 具体实现说明
    • 只需将基类中的成员函数声明为virtual就行
    • 基类中的析构函数必须为虚函数,否则会出现对象释放错误
    • 虚函数的使用将导致类对象占用更大的内存空间。(因为:编译器给每一个包括虚函数的对象添加了一个隐藏成员—指向虚函数表的指针也叫虚函数指针。虚函数表—virtual fuction table 包含了虚函数的地址,由所有拥有虚函数的对象共享。当派生类重新定义虚函数时,则将该函数的地址添加到虚函数表中)无论一个类对象中定义了多少个虚函数,虚函数指针只有一个。相应地,每个对象在内存中的大小要比没有虚函数时大4个字节(不包括虚析构函数)。
  • 子类重写(覆盖)虚函数的规则
    • 虚函数在子类和父类中的访问权限可以不同
    • 基类与派生类的虚函数名与参数列表相同。且函数返回值有以下要求:
      • 如果虚函数的返回值类型是基本数据类型:返回值类型必须相同
      • 如果虚函数的返回值类型是类本身的指针或引用:返回值类型可以不同,但派生类的返回值类型要小于基类返回值类型
  • 什么是多态,解决了什么问题
    • 多态就是一个指针指向子类对象,那么他调用的函数就是子类的对象的。实现了一个函数会根据传入参数的不同有不同的功能,函数有多个状态,就是多态。
    • 如果没有多态,就需要写多个同名函数,参数不同,就是重载。
    • 对于多态的状态来说,一定会有两个同名同参数函数,分别定义在子类和父类中
    • C++ 多态有两种:静态多态(早绑定)、动态多态(晚绑定)。静态多态是通过函数重载实现的;动态多态是通过虚函数实现的
  • 纯虚函数:
    • 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0"
    • 纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的默认实现。所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。
    • 我个人理解纯虚函数的话,在子类中定义以后成为虚函数,然后还可以在孙子类中覆盖该虚函数

2. 关键字virtual、override、final

  • virtual:放在函数的返回值前面,父类虚函数前必须写,子类可以省略(因为子类中不管写不写都是虚函数)。只能在类内部的声明语句之前,而不能用于类外部
  • override:父类的虚函数不可使用,放在子类虚函数的参数列表后。
  • final:如果我们定义的一个虚函数不想被派生类覆盖(重写),那么就要在参数列表后加一个final。
  • 回避虚函数的机制:虚函数就是为了实现多态的功能,但具体实行我们才知道他会运行那个函数,当我们想特定函数来运行的时候,就只能通过域运算符来实现。

3. 什么是重载运算符和重载函数?

  • 函数重载:在同一个作用域内,可以声明多个类似同名函数,但这些函数的形参(个数、类型或者顺序)必须不同。
  • 重载运算符:同一个作用域中的某个运算符指定多个定义,operator操作。

4. 基类为什么需要虚析构函数

防止内存泄漏。想去借助父类指针销毁子类对象的时候,不能去销毁子类对象。假如没有虚析构函数,释放一个由基类指针指向的派生类对象时,不会触发动态绑定,则只会调用基类的析构函数,不会调用派生类的。派生类中申请的空间则得不到释放导致内存泄漏。
为什么析构函数必须是虚函数?为什么c++默认的析构函数不是虚函数?

  • 将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。
  • C++ 默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此c++默认的析构函数不是虚函数,而是只有需要当做父类时,才会被设置成虚函数。
  • 类析构顺序:派生类本身析构>对象成员析构函数>基类析构函数

5. 基类的虚函数表存放在内存的什么区,虚表指针vptr的初始化时间

首先整理一下虚函数表的特征:

  • 虚函数表是全局共享的元素,且全局只有一个,在编译时就能构造完成
  • 虚函数表类似于一个数组,类对象中存储vptr指针,指向虚函数表,即虚函数表不是函数,不是程序代码,不可能存储在代码段
  • 虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针,而类中虚函数的个数在编译时期就可以确定,即虚函数表的大小可以确定,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不在堆中。

根据以上特征,虚函数表类似于类中静态成员变量,静态成员变量也是全局共享,大小确定,因此最有有可能存储在全局数据区。
虚函数表vtabel在Linux/Unix中存放在可执行文件的制度数据段中(rodata),这与微软的编译器将虚函数表存放在常量段存在一些区别
由于虚表指针vptr跟虚函数密不可分,对于有虚函数或者继承于虚函数的基类,对该类进行实例化时,在构造函数执行时会对虚表指针进行初始化,并且存放在对象内存布局的最前面。

6. 简述一下虚表数量是什么

在 C++ 中,当一个类具有虚函数时,编译器会为该类创建虚表。
虚表是一个指针数组,其中的每个元素都是一个函数指针,指向该类的虚函数的实现。在类的对象被创建时,会为其分配一个虚函数指针,该指针指向该类的虚表。当调用虚函数时,程序会根据虚函数指针查找虚表,从而找到对应的函数实现。
因此,虚表数量就是一个类中虚函数的数量。对于一个类来说,虚表数量可能是0,也可能是多个。对于一个继承关系中的每个类,都可能有自己的虚表。
多线程则是多任务的一种实现方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索PyMuPDF:Python中的强大PDF处理库

探索PyMuPDF:Python中的强大PDF处理库 背景:为何选择PyMuPDF 在数字化时代,PDF文件因其跨平台的兼容性和对格式的严格保持而成为文档交换的通用格式。然而,处理PDF文件往往需要专门的工具或库。这就是PyMuPDF库的用武之地。PyMuP…

模方单体化功能联动3DMax能支持2018版本以上的3DMax吗?

答:目前还不支持,仅支持2018版本的 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能,支持一键自动提取房屋结构,平…

【Python selenium过极验滑块】用自动化selenium 操作GEETEST极验滑块,简单粗暴

文章日期:2024.07.24 使用工具:Python 文章类型:自动化过极验滑块 文章全程已做去敏处理!!! 【需要做的可联系我】 AES解密处理(直接解密即可)(crypto-js.js 标准算法&…

Python自动化测试之Selenium各浏览器驱动下载网址

在自动化测试领域,Selenium无疑是一个不可或缺的工具。它允许开发者编写脚本来模拟用户在浏览器中的操作,从而进行自动化测试。然而,为了使用Selenium控制不同的浏览器,我们需要安装相应的浏览器驱动(WebDriver&#x…

企业利用AI智能名片S2B2C商城小程序参与社区团购的风险与机遇分析

摘要 在新零售浪潮的推动下,社区团购以其独特的商业模式迅速崛起,成为连接消费者与供应商的重要桥梁。企业纷纷探索如何有效利用这一新兴渠道,以扩大市场份额、提升品牌影响力。AI智能名片S2B2C商城小程序的引入,为企业参与社区团…

【Rust光年纪】从图形API到虚拟现实:Rust语言开发库全面解析

打造虚拟世界:Rust语言虚拟现实库全攻略 前言 随着虚拟现实技术的不断发展,越来越多的开发者开始关注使用Rust语言进行虚拟现实开发。本文将对几个用于Rust语言的虚拟现实开发库进行介绍和比较,帮助读者了解它们的核心功能、使用场景、安装…

什么是服务器带宽

什么是服务器带宽 服务器带宽是有线或无线网络通信链路在给定时间内通过计算机网络或互联网连接将最大数据量从一个点传输到另一个点的容量。简单来说,带宽指的是可以通过计算机网络或Internet连接一次发送的数据量。具体来说,带宽越大,服务器…

maven archetype

1.简介 maven脚手架是为了创建一个项目模板&#xff0c;以后新建项目都能够复用该模板 maven中模板引擎使用的是velocity,在文件中可以使用它的语法获取变量等操作 2.实现 单模块脚手架实现 pom.xml <?xml version"1.0" encoding"UTF-8"?> &…

windows下实现mongodb备份还原

添加环境变量 把mongodb安装目录下的bin路径添加到环境变量的path路径: 备份库 打开CMD&#xff0c;执行以下命令&#xff1a; mongodump -u test -p test -d test -o D://backup_mongodb//20220706 –gzip 参数说明&#xff1a; -u 用户名 -p 密码 -d 需要备份的库名称…

Spring踩坑:抽象类作为父类,使用子类@Autowired属性进行填充,属性值为null

Spring踩坑&#xff1a;抽象类作为父类&#xff0c;使用子类Autowired属性进行填充&#xff0c;属性值为null Spring Boot中抽象类和依赖注入的最佳实践引言在抽象类中使用Autowired注解protected vs private修饰符低版本Spring Boot的注意事项 构造器中的依赖注入陷阱为什么不…

MongoDB教程(二十一):MongoDB大文件存储GridFS

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、GridFS…

学习笔记(数据结构:链表 栈)3

fun为回调函数由主函数决定 栈: 栈是限定仅在表尾进行插入和删除操作的线性表。 先进后出、后进先出 栈顶:允许操作的一端 栈底:不允许操作的一端 入栈&#xff0c;出栈。 顺序栈 链式栈 1.创建 CreateSeqStack 2.销毁 DestroySeqStack 3.判断是否为空栈 IsEm…

AD7606采集控制

过采样&#xff1a;其效果就是在ADC之后增加数字滤波器的功能

观测云加入华为云「新加坡云联盟」,引领亚太创新潮流

7月19日&#xff0c;「新加坡云联盟」在华为云新加坡峰会2024上正式宣告成立。这一创新的联合不仅是新加坡乃至整个亚太地区云服务领域的重要里程碑&#xff0c;更是全球数字化转型进程中的关键一步。 观测云作为联盟的首批成员之一&#xff0c;在成立仪式上精彩亮相&#xff0…

音视频入门基础:PCM专题(3)——使用Audacity工具分析PCM音频文件

音视频入门基础&#xff1a;PCM专题系列文章&#xff1a; 音视频入门基础&#xff1a;PCM专题&#xff08;1&#xff09;——使用FFmpeg命令生成PCM音频文件并播放 音视频入门基础&#xff1a;PCM专题&#xff08;2&#xff09;——使用Qt播放PCM音频文件 音视频入门基础&am…

Centos7下安装配置最新版本Jenkins

1、基础环境配置 1.1 服务器下载Jenkins安装包 下载地址&#xff1a;Download and deploy 下载命令&#xff1a;wget https://get.jenkins.io/war-stable/2.452.3/jenkins.war 1.2 服务器安装配置JDK Jenkins 是基于 Java 语言开发的&#xff0c;因此需要 Java 运行环境支…

【Python】基础学习技能提升代码样例1:简单句式

官方教程 一、简单句式 1.1 数值 # 校验输入是否为有效数字 if not math.isnan(num):xxxx # 浮点数精度问题 print(0.1 0.2) # 0.30000000000000004 0.1 0.1 0.1 0.3 # false math.isclose(0.1 0.1 0.1, 0.3) # true round(0.1 0.1 0.1, ndigits2) round(0.3, n…

MQ传递用户信息

theme: nico 你们好&#xff0c;我是金金金。 场景 购物车里面有5个商品&#xff0c;用户勾选了并且提交订单了&#xff0c;此时需要删除购物车对应勾选的商品&#xff0c;mq的话涉及到传递用户信息~因为删除对应的购物车商品是需要传递用户信息来知晓对应用户的 生产者 消费者…

LeetCode 热题 HOT 100 (010/100)【宇宙最简单版】

【链表】No. 0206 反转链表 【简单】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…

《操作系统》(学习笔记)(王道)

一、计算机系统概述 1.1 操作系统的基本概念 1.1.1 操作系统的概念 操作系统&#xff08;OperatinggSystem&#xff0c;OS&#xff09;是指控制和管理整个计算机系统的硬件与软件资源&#xff0c;合理地组织、调度计算机的工作与资源的分配&#xff0c;进而为用户和其他软件…