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

嵌入式软件工程师面试题——2025校招社招通用(八)

说明:

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

1.继承时访问级别如何变化?

分析:
在 C++ 中,继承是可以降低父类的访问级别的。
按照访问级别不同,继承可分为以下3种。

  • public (公用继承):基类成员保持自己的访问级别;
  • protect (受保护继承):基类的 public 和 protected成员在派生类中为 protected 成 员。基类的 private 成员保持为 private;
  • private (私有继承):基类的所有成员在派生类中为 private 成员。

如果没有自定义, C++ 将使用默认继承保护级别,使用class 保留字定义的派生类默认 具有 private 继承。使用 struct 保留字定义的类默认具有public 继承。友元关系是不可以继 承的。static 成员属于类,而非对象,在继承层次中只有一个这样的成员。既可以通过基类 访问 static 成员,也可以通过派生类访问。

答案: 在C++ 中有public、protect 和 private 等3种继承访问级别。子类继承的时候,通过声明为 protect 或者 private 可以降低父类的访问级别。

2.什么是浅复制和深复制?

答案:

  • 浅复制是指将一个对象的内容简单地拷贝到另一个对象中,包括成员变量的值和指针的地址。这意味着原始对象和副本对象共享相同的指针,它们指向相同的内存地址。如果对其中一个对象进行修改,会影响到另一个对象。这可能导致潜在的问题,特别是当对象销毁时,可能会出现重复释放内存或访问无效内存的情况。

  • 深复制是指创建一个新的对象,并将原始对象的内容完全复制到新对象中,包括成员变量的值和指针所指向的内容。这意味着原始对象和副本对象有各自独立的内存空间,彼此之间不会互相干扰。对任何一个对象的修改都不会影响到另一个对象。

为了实现深复制,通常需要重载拷贝构造函数和赋值运算符,确保在复制对象时,指针所指向的内容也得到复制。可以使用动态内存分配来创建新的对象,使得两个对象在内存中是彼此独立的。
下面是一个示例,展示了浅复制和深复制的区别:

#include <iostream>
#include <cstring>class Person {
public:Person(const char* name) {size_t len = std::strlen(name) + 1;this->name = new char[len];std::strcpy(this->name, name);}// 浅复制Person(const Person& other) {this->name = other.name;  // 只是拷贝指针,共享相同的内存}// 深复制Person& operator=(const Person& other) {if (this != &other) {delete[] this->name;size_t len = std::strlen(other.name) + 1;this->name = new char[len];std::strcpy(this->name, other.name);}return *this;}~Person() {delete[] name;}void PrintName() {std::cout << "Name: " << name << std::endl;}private:char* name;
};int main() {Person person1("Alice");Person person2 = person1;  // 浅复制person1.PrintName();  // 输出 "Name: Alice"person2.PrintName();  // 输出 "Name: Alice"person2 = Person("Bob");  // 深复制person1.PrintName();  // 输出 "Name: Alice"person2.PrintName();  // 输出 "Name: Bob"return 0;
}

3.C++ 支持参数个数不确定的函数吗

分析: 支持,可变参数模板(Variadic Templates)和va_list机制

  • 可变参数模板(Variadic Templates):可变参数模板是C++11引入的特性,它允许定义接受任意数量参数的函数模板。使用可变参数模板,可以在函数模板定义中使用…语法,表示参数的可变个数。通过递归展开模板参数包,可以访问和处理每个参数。
#include <iostream>
using namespace std;// 可变参数模板的递归终止函数
void print() {cout << endl;
}// 可变参数模板的递归展开函数
template<typename T, typename... Args>
void print(T first, Args... args) {cout << first << " ";print(args...);
}int main()
{   print(1, 2, 3);print(1.0, 2.0);print(1, 2, 3, "hello", 4.5);return 0;
}

在上述示例中,print函数是一个可变参数模板函数。当递归展开时,每次都会打印第一个参数,并将剩余的参数传递给下一次递归调用,直到参数列表为空时终止。

  • va_list机制:va_list机制是C语言中的一个特性,C++也支持使用C头文件中的相关函数和宏来处理可变参数。通过使用va_list、va_start、va_arg和va_end等宏,可以在函数内部访问和处理可变数量的参数。

答案: 是的,C++支持参数个数不确定的函数。C++中有两种主要的方法来实现参数个数不确定的函数:可变参数模板(Variadic Templates)和va_list机制。

#include <iostream>
#include <cstdarg>
using namespace std;// 使用va_list机制的可变参数函数
void print(int count, ...) {va_list args;va_start(args, count);for (int i = 0; i < count; ++i) {int value = va_arg(args, int);cout << value << " ";}va_end(args);cout << endl;
}int main() {print(5, 1, 2, 3, 4, 5);return 0;
}

在上述示例中,print函数接受一个整数参数count和可变数量的整数参数。使用va_list、va_start、va_arg和va_end宏,可以在函数内部遍历并访问可变数量的参数。

4.指针形参与引用形参有什么区别

分析:
函数的形参可以是指针,此时将复制实参指针。与其他非引用类型的形参一样,该类 形参的任何改变也仅作用于局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。
被复制的指针只影响对指针的赋值。如果函数形参是非 const 类型的指针,则函数可通过指针实现赋值,修改指针所指向对象的值。

#include <iostream>
using namespace std;void reset(int *p)
{*p = 0;p = 0;
}int main()
{   int i = 42;int *p = &i;cout << "i: " << *p << '\n';    // 打印 42 cout << p << endl;              // 0x61ff08reset(p);cout << "i: " << *p << endl;    // 打印 0cout << p << endl;              // 0x61ff08return 0;
}

答案: 指针形参是指函数的参数是指针,它不会像引用形参那样通过函数调用影响实参的值,但
是调用后它会修改实参的对象。程序中建议尽量少使用指针形参,这样会使程序的可读性下降。

5.静态函数能访问类的私有成员

分析:
类的静态成员函数可以访问类的私有成员,但是静态成员函数只能直接访问类的静态 私有成员,因为静态成员函数是不可以直接访问非静态的成员的。但是静态成员函数可以借助对象名和指针来访问类的非静态私有成员。

静态函数是不可以直接访问类的私有变量的。但可以通过宏定义替换 private为 public等方法来实现对类的私有成员的访问。

答案: 静态函数只能直接访问类的静态私有成员,静态函数不可以直接访问类的非静态私有
成员,但是可以通过自定义的一些特殊方法比如宏替换访问类的非静态私有成员。

6.什么是函数模板?什么是类模板?

答案:
函数模板技术定义了参数化的非成员函数,这使得程序能够使用不同的参数类型调用 相同的函数。而至于使用何种类型,则是由编译器确定并从模板中生成相应类型的代码。 编译器确定了模板函数的实际类型参数,称之为模板的实例化。

T Add(T a, Tb)
{T res;res = a + b;return res;
}

类模板描述了能够管理其他数据类型的通用数据类型。类模板技术通常用于建立包含 其他类型的容器类,例如,队列、链表和堆栈等。对于这些容器类来说,无论哪种数据类 型,其操作方式是相同的,但是对具体的数据类型却又是专用的。标准模板库STL 就大量使用了这种技术。

template<class T>
class TemplateSample
{
private:T& eentity;
public:void F(T& arg);
};

7.变量的声明和定义有什么区别

答案:
为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。

说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。

8.C 语言的关键字 static 和 C++ 的关键字 static 有什么区别

答案:
在 C 中 static 用来修饰局部静态变量和外部静态变量、函数。而 C++中除了上述功能外,还用来定
义类的成员变量和函数。即静态成员和静态成员函数。

注意: 编程时 static 的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而 C++的静态成员则可以在多个对象实例间进行通信,传递信息。

9.一个指针可以是 volatile 吗

答案:
可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改
一个指向一个 buffer 的指针时,必须用 volatile 来修饰这个指针。

**说明:**指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。其保存的数值是个整型数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。

相关文章:

嵌入式软件工程师面试题——2025校招社招通用(八)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…...

背包笔记

01背包 朴素版01背包 cin >> n >> m; f[0][0] 0; for(int i 1; i < n; i ) {for(int j 0; j < m; j ){f[i][j] f[i - 1][j];//第i个物品不选if(j - v[i] > 0){f[i][j] max(f[i][j], f[i - 1][j - v[i]] w[i]);//选第i个物品}} }cout << f[n…...

【Redis 速通】Redis 在 Linux 上的单机服务快速搭建与部署(附完整流程步骤及命令代码)

Redis 单机版安装与部署 Written By: Xinyao Tian 概述 本文档主要描述了 Redis 的生产环境安装及配置方法。 主要步骤 编译及安装 进入 root 用户并上传 Redis 源码安装包 查看 Redis 源码安装包的上传情况: [rootcentos-host redis]# pwd /opt/redis [root centos-ho…...

前端JavaScript

文章目录 一、JavaScript概述JS简介1.ECMAScript和JavaScript的关系2.ECMAScript的历史3.什么是javas&#xff1f;4.JavaScript的作用&#xff1f; 三者之间的作用JS基础1.注释语法2.引入js的多种方式3.结束符号 变量与常量变量1.JavaScript声明2.var与let的区别常量 基本数据类…...

C语言程序设计(第五版)谭浩强 第三章课后题答案

第三章 1、假如我国国民生产总值的年增长率为7%&#xff0c; 计算10年后我国国民生产总值与现在相比增长多少百分比。计算公式为 ,其中r为年增长率&#xff0c;n为年数&#xff0c;p为与现在相比的倍数。 #include<stdio.h> #include<math.h>int main(){float r,…...

uni-app 解决钉钉小程序日期组件uni-datetime-picker不兼容ios问题

最近在使用uni-app开发 钉钉小程序 &#xff0c;遇到一个ios的兼容性问题 uni-datetime-picker 组件在模拟器上可以使用&#xff0c;在真机上不生效问题 文章目录 1. 不兼容的写法&#xff0c;uni-datetime-picker 不兼容IOS2. 兼容的写法&#xff0c;使用 dd.datePicker 实现。…...

【C++入门 三】学习C++缺省参数 | 函数重载 | 引用

C入门 三 1.缺省参数1.1 缺省参数概念1.2 缺省参数分类 2. 函数重载2.1 函数重载概念2.2 C支持函数重载的原理--名字修饰(name Mangling) 3.引用3.1引用概念3.2引用特性3.3 常引用3.4 使用场景1. 做参数2. 做返回值 3.5 传值、传引用效率比较3.6引用和指针的区别 4.引用和指针的…...

视频增强修复软件Topaz Video AI mac中文版支持功能

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xff…...

C# 使用Thread类建线程

C# 使用Thread类建线程 目录 C# 使用Thread类建线程引言Thread类启动线程优先级后台运行线程状态线程名称线程ID最后 引言 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程是我们程序常用的并行运行控制手段&#xff0c;…...

asyncio协程框架

asyncio 基本用法 asyncio 包含以下几个主要的组件&#xff1a;协程 asyncio 支持使用 async/await 语法定义协程&#xff08;coroutine&#xff09;。协程是可以暂停和恢复执行的函数&#xff0c;可以实现非阻塞式的异步编程。 import asyncioasync def coroutine():print(H…...

TSINGSEE智慧安防:AI人员入侵检测算法的工作原理及应用场景概述

人员入侵检测算法基于视频分析技术&#xff0c;自动对视频画面进行分析识别&#xff0c;可以对危险区的人员闯入、靠近等行为进行实时进行检测并预警&#xff0c;无需人工干预&#xff0c;协助管理者对场所的安全问题进行监管&#xff0c;可以广泛运用在学校、园区、工地、车站…...

Python:PDF转长图像和分页图像

简介&#xff1a;随着电子化文档的普及&#xff0c;PDF文件的使用频率越来越高。有时我们需要将PDF中的内容转化为图片格式进行分享或编辑&#xff0c;那么如何才能轻松地完成此任务呢&#xff1f;本文将为你展示一个Python工具&#xff1a;如何将PDF文件转化为图片&#xff0c…...

第48天:内置对象方法、 前端基础之BOM和DOM

内置对象方法 RegExp对象 // 定义正则表达式两种方式 var reg1 new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}"); var reg2 /^[a-zA-Z][a-zA-Z0-9]{5,9}$/;// 正则校验数据 reg1.test(jason666) reg2.test(jason666)/*第一个注意事项&#xff0c;正则表达式中不能有空格…...

CMake系列EP02: 构建可执行程序和库

文章目录 cmake --buildmessage命令切换生成器使用ninja构建项目切换生成器的工作原理 构建和链接静态库和动态库add_library命令add_executable命令构建OBJECT类型的库条件编译opion命令option更多信息 指定编译器构建类型切换构建类型&#xff1a; 设置编译器选项cmake调试设…...

比亚迪今年的薪资。。

大家或许已经对比亚迪在西安的宣讲会有所耳闻&#xff0c;那场面真的是座无虚席。如果你稍微迟到了一些&#xff0c;那么你可能只能在门外或是走廊听了。 事实上&#xff0c;许多人早早地抵达了&#xff0c;只要稍微晚到&#xff0c;就可能错过了室内的位置。 更令人震惊的是&…...

【OpenCV实现图像找到轮廓的不同特征,就像面积,周长,质心,边界框等等。】

文章目录 概要图像矩凸包边界矩形 概要 OpenCV是一个流行的计算机视觉库&#xff0c;它提供了许多图像处理和分析功能&#xff0c;其中包括查找图像中物体的轮廓。通过查找轮廓&#xff0c;可以提取许多有用的特征&#xff0c;如面积、周长、质心、边界框等。 以下是几种使用…...

数仓建模—数仓建设概论

数仓建设概论 文章目录 数仓建设概论什么是数据仓库数据仓库对企业的意义1.全面掌握企业数据2.支持企业的决策制定3. 可靠性高怎么做数据仓库建1. 需求分析2. 设计数据仓库架构3. 数据采集4. 数据清洗5. 数据结构设计6. 数据分析7. 数据可视化8. 数据维护总结前面我们介绍了关于…...

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本&#xff0c;而dnmp只支持到php8.0。安装php8.2的步骤如下&#xff1a; 1. 从/services/php80目录复制一份出来&#xff0c;重命名为php82&#xff0c;extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…...

Distilling the Knowledge in a Neural Network【论文解析】

Distilling the Knowledge in a Neural Network 知识蒸馏 摘要1 引言摘要 提高几乎任何机器学习算法性能的一种非常简单的方法是在相同的数据上训练许多不同的模型,然后对它们的预测进行平均处理[3]。不幸的是,使用整个模型集合进行预测既繁琐又可能过于计算密集,特别是如果…...

基于深度学习的自动驾驶汽车语义分割与场景标注算法研究。

自动驾驶汽车是当前研究的热点领域之一&#xff0c;其中基于深度学习的语义分割与场景标注算法在自动驾驶汽车的视觉感知中具有重要作用。本文将围绕自动驾驶汽车的语义分割与场景标注算法展开研究。 一、研究背景 随着人工智能技术的不断发展&#xff0c;自动驾驶汽车逐渐成…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...

生产管理系统开发:专业软件开发公司的实践与思考

生产管理系统开发的关键点 在当前制造业智能化升级的转型背景下&#xff0c;生产管理系统开发正逐步成为企业优化生产流程的重要技术手段。不同行业、不同规模的企业在推进生产管理数字化转型过程中&#xff0c;面临的挑战存在显著差异。本文结合具体实践案例&#xff0c;分析…...

第6章:Neo4j数据导入与导出

在实际应用中&#xff0c;数据的导入与导出是使用Neo4j的重要环节。无论是初始数据加载、系统迁移还是数据备份&#xff0c;都需要高效可靠的数据传输机制。本章将详细介绍Neo4j中的各种数据导入与导出方法&#xff0c;帮助读者掌握不同场景下的最佳实践。 6.1 数据导入策略 …...