嵌入式软件工程师面试题——2025校招社招通用(C/C++)(四十六)

说明:

  • 面试群,群号: 228447240
  • 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
  • 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
  • 博主与大家一起学习,一起刷题,共同进步;
  • 写文不易,麻烦给个三连!!!

前面1-15已经是C/C++,但是由于前面写的比较混乱,把八股文和题目混在了一起,所以从这一篇开始重新整理重新写,前面1-15也就可以选看了,希望多多支持!

1.C++中新增了string,它与C语言中的 char *有什么区别吗?它是如何实现的?

答案:

string 继承自 basic_string, 其实是对 char* 进行了封装,封装的 string 包含了 char* 数组,容量,长度等等属性。
string 可以进行动态扩展,在每次扩展的时候另外申请一块原空间大小两倍的空间( 2^n ),然后将原字符串拷贝过去,并加上新增的内容。

2.有哪些情况必须用到成员列表初始化?作用是什么?

答案:
1) 必须使用成员初始化的四种情况
当初始化一个引用成员时;
当初始化一个常量成员时;
当调用一个基类的构造函数,而它拥有一组参数时;
当调用一个成员类的构造函数,而它拥有一组参数时;
2) 成员初始化列表做了什么
编译器会一一操作初始化列表,以适当的顺序在构造函数之内安插初始化操作,并且在任何显示用户代码之前;
list 中的项目顺序是由类中的成员声明顺序决定的,不是由初始化列表的顺序决定的;

3.什么是内存泄露,如何检测与避免

答案:

内存泄露

一般我们常说的内存泄漏是指 堆内存的泄漏 。堆内存是指程序从堆中分配的,大小任意的 ( 内存块的大小可以在程序运行期决定) 内存块,使用完后必须显式释放的内存。应用程序般使用 malloc, realloc 、new等函数从堆中分配到块内存,使用完后,程序必须负责相应的调用 free delete 释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了.
避免内存泄露的几种方式
  • 计数法:使用new或者malloc时,让该数+1deletefree时,该数-1,程序执行完打印这个计数,如果不为0则表示存在内存泄露
  • 一定要将基类的析构函数声明为虚函数
  • 对象数组的释放一定要用delete []
  • new就有delete,有malloc就有free,保证它们一定成对出现

4.说说移动构造函数

答案:
1) 我们用对象 a 初始化对象 b ,后对象 a 我们就不在使用了,但是对象 a 的空间还在呀(在析构之前),既然拷贝构造函数,实际上就是把a 对象的内容复制一份到 b 中,那么为什么我们不能直接使用 a 的空间呢?这样就避免了新的空间的分配,大大降低了构造的成本。这就是移动构造函数设计的初衷;
2) 拷贝构造函数中,对于指针,我们一定要采用深层复制,而移动构造函数中,对于指针,我们采用浅层复制。浅层复制之所以危险,是因为两个指针共同指向一片内存空间,若第一个指针将其释放,另一个指针的指向就不合法了。 所以我们只要避免第一个指针释放空间就可以了。避免的方法就是将第一个指针(比如 a->value )置为 NULL ,这样在调用析构函数的时候,由于有判断是否为 NULL 的语句,所以析构 a 的时候并不会回收 a- >value 指向的空间;
3) 移动构造函数的参数和拷贝构造函数不同,拷贝构造函数的参数是一个左值引用,但是移动构造函数的初值是一个右值引用。意味着,移动构造函数的参数是一个右值或者将亡值的引用。也就是说,只用用一个右值,或者将亡值初始化另一个对象的时候,才会调用移动构造函数。而那个move 语句,就是将一个左值变成一个将亡值。

5.静态类型和动态类型,静态绑定和动态绑定的介绍

答案:

静态类型:对象在声明时采用的类型,在编译期既已确定;
动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的;
静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期;
动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期;

6.引用是否能实现动态绑定,为什么可以实现

答案:

可以。
引用在创建的时候必须初始化,在访问虚函数时,编译器会根据其所绑定的对象类型决定要调用哪个函数。注意只能调用虚函数。

7.怎样判断两个浮点数是否相等?

答案:
对两个浮点数判断大小和是否相等不能直接用 == 来判断,会出错!明明相等的两个数比较反而是不相等!对于两个浮点数比较只能通过相减并与预先设定的精度比较,记得要取绝对值!浮点数与0 的比较也应该注意。与浮点数的表示方式有关。

8.指针加减计算要注意什么?

答案:

指针加减本质是对其所指地址的移动,移动的步长跟指针的类型是有关系的,因此在涉及到指针加减运算需要十分小心,加多或者减多都会导致指针指向一块未知的内存地址,如果再进行操作就会很危险。
举个例子:
#include <iostream>
using namespace std;
int main()
{int *a, *b, c;a = (int*)0x500;b = (int*)0x520;c = b - a;printf("%d\n", c); // 8a += 0x020;c = b - a;printf("%d\n", c); // -24return 0;
}
首先变量 a b 都是以 16 进制的形式初始化,将它们转成 10 进制分别是 1280 5*16\^2=1280 )和
1312 5*16\^2+2*16=1312) , 那么它们的差值为 32 ,也就是说 a b 所指向的地址之间间隔 32 个位,但是考虑到是int 类型占 4 位,所以 c 的值为 32/4=8
a 自增 16 进制 0x20 之后,其实际地址变为 1280 + 2*16*4 = 1408 ,(因为一个 int 4 位,所以要乘 4 ),这样它们的差值就变成了1312 - 1280 = -96 ,所以 c 的值就变成了 -96/4 = -24

9.C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?

答案:
1) 指针参数传递本质上是值传递,它所传递的是一个地址值。
值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本(替身)。
值传递的特点是,被调函数对形式参数的任何操作都是作为局部变量进行的,不会影响主调函数的实参变量的值(形参指针变了,实参指针不会变)。
2) 引用参数传递过程中,被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。
被调函数对形参(本体)的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量(根据别名找到主调函数中的本体)。
因此,被调函数对形参的任何操作都会影响主调函数中的实参变量。
3) 引用传递和指针传递是不同的,虽然他们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。
而对于指针传递的参数,如果改变被调函数中的指针地址,它将应用不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量(地址),那就得使用指向指针的指针或者指针引用。
4) 从编译的角度来讲,程序在编译时分别将指针和引用添加到符号表上,符号表中记录的是变量名及变量所对应地址。
指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值(与实参名字不同,地址相同)。
符号表生成之后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。

10.类如何实现只能静态分配和只能动态分配

答案:
1) 前者是把 new delete 运算符重载为 private 属性。后者是把构造、析构函数设为 protected 属性,再用子类来动态创建
2) 建立类的对象有两种方式:
静态建立,静态建立一个类对象,就是由编译器为对象在栈空间中分配内存;
动态建立, A *p = new A(); 动态建立一个类对象,就是使用 new 运算符为对象在堆空间中分配内存。 这个过程分为两步,第一步执行operator new() 函数,在堆中搜索一块内存并进行分配;第二步调用类构造函数构造对象;
3) 只有使用 new 运算符,对象才会被建立在堆上,因此只要限制 new 运算符就可以实现类对象只能建立在栈上,可以将new 运算符设为私有。

11.如果想将某个类用作基类,为什么该类必须定义而非声明?

答案:
派生类中包含并且可以使用它从基类继承而来的成员,为了使用这些成员,派生类必须知道他们是什么。
所以必须定义而非声明。

12.继承机制中对象之间如何转换?指针和引用之间如何转换?

答案:
1) 向上类型转换
将派生类指针或引用转换为基类的指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全的。
2) 向下类型转换
将基类指针或引用转换为派生类指针或引用被称为向下类型转换,向下类型转换不会自动进行,因为一个基类对应几个派生类,所以向下类型转换时不知道对应哪个派生类,所以在向下类型转换时必须加动态类型识别技术。RTTI 技术,用 dynamic_cast 进行向下类型转换。

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

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

相关文章

Blender教程(基础)-内插面、分离、环切、倒角-08

一、内插面 菜单位置如下图位置。 单击需要处理的面&#xff0c;出现一个黄色的圈。 1、菜单选中内插 鼠标悬停在黄色圈内单击左键可以来回实现内插&#xff0c;但是发现并不好操作。 2、快捷键内插 在选中需要操作的面之后&#xff0c;鼠标移动到外面&#xff0c;键盘在英…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令&#xff1a; cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注&#xff1a;cp -r 会把所有source当作普通文件&#xff08;regular文件&#xff09;&#x…

【CMU-自主导航与规划】M-TARE planner 配置与运行

M-TARE docker M-TARE 源码 一、依赖 Docker, Docker Compose, NVIDIA Container Toolkit, Nvidia GPU Driver&#xff08;需要至少2个&#xff0c;带Nvidia GPU&#xff09; 1.1 Docker docker -v #查询版本1.2 Docker Compose docker compose version1.3 …

Python 数据分析实战——社交游戏的用户流失?酒卷隆治_案例2

# 什么样的顾客会选择离开 # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&#xff09; user_id…

23-GPTs Actions详细解析:如何查找、对接API,及如何编写Schema

目录 1. 挖掘一个API接口,并将其对接到GPTs中1.1 如何寻找API1.2 把API对接到Schema中1.3 Schema中的参数结构本节详细介绍GPTs Actions 中的Schema。如何写、它里面的结构是什么、里面参数的含义。 后续使用GPTs过程中,如何找到自己想要的API,以及如何把找到的API对接到GPT…

Shell - 学习笔记 - 2.4 - Shell位置参数(命令行参数)

我们先来说一下 Shell 位置参数是怎么回事。 运行 Shell 脚本文件时我们可以给它传递一些参数&#xff0c;这些参数在脚本文件内部可以使用$n的形式来接收&#xff0c;例如&#xff0c;$1 表示第一个参数&#xff0c;$2 表示第二个参数&#xff0c;依次类推。 同样&#xff0c;…

时隔3年 | 微软 | Windows Server 2025 重磅发布

最新功能 以下是微软产品团队正在努力的方向&#xff1a; Windows Server 2025 为所有人提供的热补丁下一代 AD 活动目录和 SMB数据与存储Hyper-V 和人工智能还有更多… Ignite 发布视频 Windows Server 2025 Ignite Video 介绍 Windows Server 2022 正式发布日期是2021年…

Uncaught SyntaxError: Unexpected token ‘<‘ (at EasyPlayer-element.min.js:1:1)

在vue项目运行的时候&#xff0c;F12出现以下错误 Uncaught SyntaxError: Unexpected token < (at EasyPlayer-element.min.js:1:1)原因 在index.html中引入 这个&#xff0c;但是在static文件夹中并不存在该文件 解决办法 将EasyPlayer-element.min.js这个文件复制到stati…

Linux部署lomp环境,安装typecho、WordPress博客

部署lomp环境&#xff0c;安装typecho、WordPress博客 一、环境要求1.1.版本信息1.2.准备阿里云服务器【新用户免费使用三个月】1.3.准备远程工具【FinalShell】 二、Linux下安装openresty三、Linux下安装Mysql四、安装Apache【此步骤可省略】4.1.安装Apache服务及其扩展包4.2.…

EasyExcel通用导入 | 简单封装

0. 前言&#xff1a;1. 基本思路&#xff1a;2. 调用代码&#xff1a; 0. 前言&#xff1a; 之前做了好几个导入&#xff0c;用EasyExcel每次都要定义监听器去处理&#xff0c;就想能不能做个通用的方式&#xff0c;如下 1. 基本思路&#xff1a; 导入无非主要就是参数校验和数…

人脸识别技术在网络安全中有哪些应用前景?

人脸识别技术在网络安全中有广泛的应用前景。以下是一些主要的应用方向&#xff1a; 1. 身份验证和访问控制&#xff1a;人脸识别可以用作一种更安全和方便的身份验证方法。通过将用户的人脸与事先注册的人脸进行比对&#xff0c;可以实现强大的身份验证&#xff0c;避免了传统…

第九节HarmonyOS 常用基础组件14-DataPanel

1、描述 数据面板组件&#xff0c;用于将多个数据占比情况使用占比图进行展示。 2、接口 DataPanel(options:{values: number[], max?: numner, type?: DataPanelType}) 3、参数 参数名 参数类型 必填 描述 values number[] 是 数据值列表&#xff0c;最多含9条数…

【云原生】docker-compose单机容器集群编排工具

目录 一、docker-compose容器编排的简介 二、docker-compose的使用 1、docker-compose的安装 2、docker-compose的配置模板文件yaml文件的编写 &#xff08;1&#xff09;布尔值类型 &#xff08;2&#xff09;字符串类型 &#xff08;3&#xff09;一个key有多个值 &am…

簇索引和普通索引是什么在不同的SQL语句中哪个效率更高

当我们在讨论数据库中的簇索引&#xff08;Clustered Index&#xff09;和普通索引&#xff08;Non-Clustered Index&#xff09;时&#xff0c;可以通过具体的例子来理解它们之间的差异和工作方式。以下是基于SQL Server的示例&#xff0c;但请注意&#xff0c;其他数据库系统…

中间件

在 Java 开发中&#xff0c;中间件是指位于应用程序和操作系统之间的软件层&#xff0c;它提供了一些通用的功能和服务&#xff0c;帮助简化开发和部署过程&#xff0c;提高系统的可靠性、性能和可扩展性。 常见的 Java 中间件包括&#xff1a; 1.应用服务器&#xff08;Appl…

WebGL 入门:开启三维网页图形的新篇章(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

SQL报错注入

君衍. 一、sqllabs第五关报错注入updatexml报错注入原理及思路 二、常见的报错函数三、floor报错注入原理1、概念2、函数回顾2.1 rand函数2.2 floor(rand(0)*2)函数2.3 group by函数2.4 count(*)函数2.5 函数综合报错 3、报错分析4、总结 一、sqllabs第五关报错注入 之前我在这…

spring-bus消息总线的使用

文章目录 依赖bus应用接口用到的封装参数类 接收的应用监听器定义的事件类 使用bus定义bus远程调用A应用数据更新后通过bus数据同步给B应用 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp…

路由、组件目录存放

文章目录 单页应用程序&#xff1a;SPA- Single Page Application路由的介绍VuePouter的介绍VueRouted 的使用 组件目录存放问题&#xff08;组件分类&#xff09; 单页应用程序&#xff1a;SPA- Single Page Application 单页应用&#xff08;SPA&#xff09;:所有功能在一个…

VA_LIST可变参数列表使用学习

前言 在C语言中&#xff0c;我们写函数的时候&#xff0c;有可能遇到函数入口参数不确定的问题&#xff0c;就可以使用val_list。va_list是为解决变参问题定义的一个类型&#xff0c;可以参数的个数不定&#xff0c;也可以每个参数的类型不同&#xff0c;使用需要包含头文件st…