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

说明:

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

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

1.知道C++中的组合吗?它与继承相比有什么优缺点吗?

答案:

继承
继承是i s a 的关系,比如说 Student 继承 Person, 则说明 Student is a Person 。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。
继承的缺点:
①父类的内部细节对子类是可见的。
②子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行
为。
③如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。所 以说子类与父类是一种高耦合,违背了面向对象思想。
组合
组合也就是设计类的时候把要组合的类的对象加入到该类中作为自己的成员变量。
组合的优点:
①当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的。
②当前对象与包含的对象是一个低耦合关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。
③当前对象可以在运行时动态的绑定所包含的对象。可以通过 set 方法给所包含对象赋值。
组合的缺点:①:容易产生过多的对象。②:为了能组合多个对象,必须仔细对接口进行定义。

2.函数指针?

答案:
1) 什么是函数指针 ?
函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。
一个具体函数的名字,如果后面不跟调用符号 ( 即括号 ) ,则该名字就是该函数的指针 ( 注意:大部分情况下,可以这么认为,但这种说法并不很严格)
2) 函数指针的声明方法
int (*pf)(const int&, const int&); 
3) 为什么有函数指针
函数与数据项相似,函数也有地址。我们希望在同一个函数中通过使用相同的形参在不同的时间使用产生不同的效果。
4) 一个函数名就是一个指针,它指向函数的代码
一个函数地址是该函数的进入点,也就是调用函数的地址。函数的调用可以通过函数名,也可以通过指向函数的指针来调用。函数指针还允许将函数作为变元传递给其他函数;
5) 两种方法赋值:
指针名 = 函数名; 指针名 = & 函数名

3.说一说你理解的内存对齐以及原因

答案:
1 、 分配内存的顺序是按照声明的顺序。
2 、 每个变量相对于起始位置的偏移量必须是该变量类型大小的整数倍,不是整数倍空出内存,直到偏移量是整数倍为止。
3 、 最后整个结构体的大小必须是里面变量类型最大值的整数倍。
添加了 #pragma pack(n) 后规则就变成了下面这样:
1 、 偏移量要是 n 和当前变量大小中较小值的整数倍
2 、 整体大小要是 n 和最大变量大小中较小值的整数倍
3 n 值必须为 1,2,4,8… ,为其他值时就按照默认的分配规则

4.defineconsttypedefinline的使用方法?他们之间有什么区别

答案:
const#define的区别
1) const 定义的常量是变量带类型,而 #define 定义的只是个常数不带类型;
2) define 只在预处理阶段起作用,简单的文本替换,而 const 在编译、链接过程中起作用;
3) define 只是简单的字符串替换没有类型检查。而 const 是有数据类型的,是要进行判断的,可以避免一些低级错误;
4) define 预处理后,占用代码段空间, const 占用数据段空间;
5) const 不能重定义,而 define 可以通过 #undef 取消某个符号的定义,进行重定义;
6) define 独特功能,比如可以用来防止文件重复引用。
#define和别名typedef的区别
1) 执行时间不同, typedef 在编译阶段有效, typedef 有类型检查的功能; #define 是宏定义,发生在预处理阶段,不进行类型检查;
2) 功能差异, typedef 用来定义类型的别名,定义与平台无关的数据类型,与 struct 的结合使用等。
#define 不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
3) 作用域不同, #define 没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef 有自己的作用域。
defineinline的区别
1) #define 是关键字, inline 是函数;
2) 宏定义在预处理阶段进行文本替换, inline 函数在编译阶段进行替换;
3) inline 函数有类型检查,相比宏定义比较安全;

5.你知道printf函数的实现原理是什么吗

答案:
C/C++ 中,对函数参数的扫描是从后向前的。
C/C++ 的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2 块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数的最后面,最后压入的参数在最下面,结构上看起来是第一个,所以最后压入的参数总是能够被函数找到,因为它就在堆栈指针的上方。
printf 的第一个被找到的参数就是那个字符指针,就是被双引号括起来的那一部分,函数通过判断字符串里控制参数的个数来判断参数个数及数据类型,通过这些就可算出数据需要的堆栈指针的偏移量了,下面给出printf("%d,%d",a,b); (其中 a b 都是 int 型的)的汇编代码。

6.coutprintf有什么区别?

答案:
cout<< 是一个函数, cout<< 后可以跟不同的类型是因为 cout<< 已存在针对各种类型数据的重载,所以会自动识别数据的类型。输出过程会首先将输出字符放入缓冲区,然后输出到屏幕。
cout 是有缓冲输出 :
cout < < "abc " < <endl; 
或cout < < "abc\n ";cout < <flush; 这两个才是一样的.
flush 立即强迫缓冲输出。
printf 是无缓冲输出。有输出时立即输出。

7.当程序中有函数重载时,函数的匹配原则和顺序是什么

答案:
1) 名字查找
2) 确定候选函数
3) 寻找最佳匹配

8.定义和声明的区别

答案:
如果是指变量的声明和定义:
从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。
如果是指函数的声明和定义:
声明:一般在头文件里,对编译器说:这里我有一个函数叫 function() 让编译器知道这个函数的存在。
定义:一般在源文件里,具体就是函数的实现过程 写明函数体。

9.隐式转换,如何消除隐式转换

答案:
1 C++ 的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的。所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为。很多时候用户可能都不知道进行了哪些转换
2 C++ 面向对象的多态特性,就是通过父类的类型实现对子类的封装。通过隐式转换,你可以直接将一个子类的对象使用父类的类型进行返回。在比如,数值和布尔类型的转换,整数和浮点数的转换等。某些方面来说,隐式转换给C++ 程序开发者带来了不小的便捷。 C++ 是一门强类型语言,类型的检查是非常严格的。
3 、 基本数据类型 基本数据类型的转换以取值范围作为转换基础(保证精度不丢失)。隐式转换发生在从小-> 大的转换中。比如从 char 转换为 int 。从 int->long 。自定义对象子类对象可以隐式的转换为父类对象。
4 C++ 中提供了 explicit 关键字,在构造函数声明的时候加上 explicit 关键字,能够禁止隐式转换。
5 、如果构造函数只接受一个参数,则它实际上定义了转换为此类类型的隐式转换机制。可以通过将构造函数声明为explicit 加以制止隐式类型转换,关键字 explicit 只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,所以无需将这些构造函数指定为explicit

10.你知道strcpymemcpy的区别是什么吗?

答案:
1 复制的内容不同 strcpy 只能复制字符串,而 memcpy 可以复制任意内容,例如字符数组、整型、结构体、类等。
2 复制的方法不同 strcpy 不需要指定长度,它遇到被复制字符的串结束符 "\0" 才结束,所以容易溢出。memcpy 则是根据其第 3 个参数决定复制的长度。
3 用途不同。通常在复制字符串时用 strcpy ,而需要复制其他类型数据时则一般用 memcpy

11.程序在执行int main(int argc, char *argv[])时的内存结构,你了解吗?

答案:
参数的含义是程序在命令行下运行的时候,需要输入 argc 个参数,每个参数是以 char 类型输入的,依次存在数组里面,数组是 argv[] ,所有的参数在指针。
char * 指向的内存中,数组的中元素的个数为 argc 个,第一个参数为程序的名称。

12.如果有一个空类,它会默认添加哪些函数

答案:
1) Empty(); // 缺省构造函数//2) Empty( const Empty& ); // 拷贝构造函数//3) ~Empty(); // 析构函数//4) Empty& operator=( const Empty& ); // 赋值运算符//

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

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

相关文章

【每日一题】5.LeetCode——环形链表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

抖店春节飞鸽还用回复吗?飞鸽自动回复怎么设置?

一、抖店春节飞鸽还用回复吗&#xff1f; 在春节期间&#xff0c;由于员工休假和放假的原因&#xff0c;客服人员数量可能会减少。这就导致了客服团队在春节期间的人手不足&#xff0c;难以及时回复顾客的咨询和问题。 然而&#xff0c;为了保证顾客的满意度和体验&#xff0…

【智能家居入门之环境信息监测】(STM32、ONENET云平台、微信小程序、HTTP协议)

作为入门本篇只实现微信小程序接收下位机上传的数据&#xff0c;之后会持续发布如下项目&#xff1a;①可以实现微信小程序控制下位机动作&#xff0c;真正意义上的智能家居&#xff1b;②将网络通讯协议换成MQTT协议再实现上述功能&#xff0c;此时的服务器也不再是ONENET&…

c# 对路径的访问被拒绝

c#写入一个文件&#xff0c;报错&#xff1a; c# 对路径的访问被拒绝 解决方法&#xff1a; 检查文件路径和目录权限&#xff1a; 确保你的应用程序有权限写入指定的文件或目录。在某些情况下&#xff0c;你可能需要以管理员身份运行应用程序或更改文件/目录的权限。 确保目…

【动态规划】【字符串】【行程码】1531. 压缩字符串

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode 1531. 压缩字符串 II 行程长度编码 是一种常用的字符串压缩方法&#xff0c;它将连续的相同字符&#xff08;重复 2 次或更多次&#xff09;替换为字符和表示字符计数的数字&#xff08;行程长度&#xff09;…

将图片批量导入PPT

1.代码 这部分使用到了“python-pptx”这个库&#xff0c;首先设置储存图片的文件夹路径&#xff0c;输入新建PPT的名字&#xff0c;然后自动将文件夹下的JPG图片按编号顺序写入PPT文件&#xff0c;最后保存&#xff1a; import os import pptx from pptx.util import Inches …

Linux:简单聊聊线程调度

目录 一、什么是线程调度&#xff1f;二、什么时候会进行线程调度&#xff1f;三、什么原因会导致某个线程调度延迟&#xff1f;四、内核抢占和抢占式调度五、应用层线程优先级设置过高会导致什么问题&#xff1f; 在工作中&#xff0c;线程调度这个词我们经常提及&#xff0c;…

MyBatis详解(6)-- 分页及缓存

MyBatis详解&#xff08;6&#xff09; 分页缓存特点&#xff1a;限制&#xff1a;术语&#xff1a;加载分类立即加载&#xff1a;延迟加载&#xff1a;mybatis缓存&#xff1a; 缓存的适用性MyBatis 缓存分类一级缓存注意&#xff1a;一级缓存未命中二级缓存二级缓存的优劣自定…

java - 多态

多态&#xff1a;它允许不同类型的对象对同一方法进行不同的实现&#xff0c; 具体来说&#xff0c;多态性指的是&#xff1a;通过父类的引用变量&#xff0c;来引用子类的对象&#xff0c;从而实现对不同对象的统一操作。 多态&#xff0c;只适用于方法&#xff0c;不适用于属…

php小数四舍五入、向上取整、向下取整

简单示例 1、round 对浮点数进行四舍五入 $result round(3.456, 2); var_dump($result);// 输出结果为&#xff1a;double(3.46)$result round(3.451, 2); var_dump($result);// 输出结果为&#xff1a;double(3.45) 2、ceil 进一取整:向上取整返回下一个最高的整数 $r…

qq通讯录怎么关闭?QQ好友删除了怎么恢复?

在QQ中&#xff0c;通讯录是我们管理好友和进行聊天的重要工具&#xff0c;但有时候我们可能需要一些隐私保护&#xff0c;不让一些用户通过手机通讯录添加自己。如果您正在思考qq通讯录怎么关闭以及恢复意外删除的好友&#xff0c;本文将为您详细介绍如何关闭QQ通讯录和恢复被…

php实现多进程的几种方式

目录 一&#xff1a;使用pcntl扩展库 二&#xff1a;使用Swoole扩展 三&#xff1a;使用多进程模式PHP-FPM 在PHP中实现多进程主要有以下几种方式&#xff1a; 一&#xff1a;使用pcntl扩展库 pcntl扩展库提供了多线程相关的函数&#xff0c;如pcntl_fork()用于创建子进程…

详解操作系统各章大题汇总(死锁资源分配+银行家+进程的PV操作+实时调度+逻辑地址->物理地址+页面置换算法+磁盘调度算法)

文章目录 第三章&#xff1a;死锁资源分配图例一例二 第三章&#xff1a;银行家算法第四章&#xff1a;进程的同步与互斥做题步骤PV操作的代码小心容易和读者写者混 1.交通问题&#xff08;类似读者写者&#xff09;分析代码 2.缓冲区问题&#xff08;第二个缓冲区是复制缓冲区…

RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Idea编写mapper.xml文件提示表名和字段

一、连接database 二、setting- > language -> sql Dialects中 的选项设为 mysql就可以了 三、测试

从零开始做题:逆向 ret2shellcode orw

1.题目信息 BUUCTF在线评测 下载orw时防病毒要关闭 2.题目分析 orw是open、read、write的简写。有时候binary会通过prctl、seccomp进行沙箱保护&#xff0c;并不能getshell。只能通过orw的方式拿到flag。 fdopen&#xff08;‘./flag’); # 打开flag文件&#xff0c;得到fd…

解决Qt连接不上mysql数据库

问题: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7 下载网盘中的三个文件&#xff08;网盘链接在文章结尾&#xff09;&#xff1a;qsqlmysql.dll、qsqlmysqld.qll、libmysql.dll找到你安装Qt的目录&#xff…

Android MTE技术详解

1.MTE概念 MTE&#xff08;内存标记扩展&#xff09;是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中&#xff0c;类似的机制有ASAN、HWSAN。但两者因为性能开销代价高昂&#xff0c;不适用于广泛部署&#xff08;仅调试使用&#xff09;。MTE当前…

语义分割 | 基于 VGG16 预训练网络和 Segnet 架构实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要使用数据标注工具 Labelme 对猫&#xff08;cat&#xff09;和狗&#xff08;dog&#xff09;这两种训练样本进行标注&#xff0c;使用预训练模型 VGG16 作为卷积基&#xff0c;并在其之上添加了全连接层。基于标注样本…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…