当前位置: 首页 > 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;自动驾驶汽车逐渐成…...

国内可用超丝滑ChatGPT4.0(附网址及微信入口)

镜像网站的设置可以带来以下优势&#xff1a; 1.提高访问速度&#xff1a;由于镜像网站部署在全球不同的服务器上&#xff0c;用户可以从最近的服务器访问网站&#xff0c;从而减少延迟和提高加载速度。 2.增加可用性&#xff1a;如果主网站遭遇故障或网络拥堵&#xff0c;用…...

linux入门---线程的同步

目录标题 什么是同步生产者和消费者模型三者之间的关系消费者生产者模型改进生产者消费者模型特点条件变量的作用条件变量有关的函数条件变量的理解条件变量的使用 什么是同步 这里通过一个例子来带着大家了解一下什么是同步&#xff0c;在生活中大家肯定遇到过排队的情景比如…...

UI设计一定不能错过的4款常用工具

虽然设计审美很重要&#xff0c;但软件只是一种工具&#xff0c;但就像走楼梯和坐电梯到达顶层一样&#xff0c;电梯的效率显然更高&#xff0c;易于使用的设计工具也是如此。让我们了解一下UI设计的主流软件&#xff0c;以及如何选择合适的设计软件。 即时设计 软件介绍 即…...

JavaScript 基础 - 第2天

理解什么是流程控制&#xff0c;知道条件控制的种类并掌握其对应的语法规则&#xff0c;具备利用循环编写简易ATM取款机程序能力 运算符语句综合案例 运算符 算术运算符 数字是用来计算的&#xff0c;比如&#xff1a;乘法 * 、除法 / 、加法 、减法 - 等等&#xff0c;所以经…...

MyBatis和JDBC异同点

MyBatis和JDBC是两种不同的数据库访问技术&#xff0c;它们有以下几点区别&#xff1a; 抽象层级&#xff1a;JDBC&#xff08;Java Database Connectivity&#xff09;是Java提供的一种标准API&#xff0c;用于与数据库进行交互。它提供了一系列的接口和类&#xff0c;使开发人…...

关于yarn安装一些东西报错时的处理方法

The engine "node" is incompatible with this module. Expected version "^14.18.0 || ^16.14.0 || >18.0.0". Got "17.9.0"出现遮掩刮得错误时直接使用这个命令 yarn config set ignore-engines true 忽略错误就可以了 直接安装自己想安装…...

datagrip 使用自定义参数

两种使用方法&#xff1a; 1. 直接打问号❓&#xff0c;执行的时候会问你这个问号填什么 2. 设置参数&#xff0c;执行的时候会问你这个参数填什么 格式&#xff1a;${xxxx} xxxx是你定义的参数名字 SELECT ${column_name} FROM actor WHERE actor_id${actor_id} 执行就会问…...

css实现平行四边形按钮

当使用CSS实现平行四边形按钮时&#xff0c;可以使用transform属性和::before或::after伪元素来创建。下面是一个示例代码&#xff1a; <!DOCTYPE html> <html> <head> <style> .button {width: 150px;height: 50px;background-color: #4CAF50;color: …...

Jmeter只能做性能测试吗?

Jmeter除了可以性能测试&#xff0c;还能做接口测试 1、Jmeter和Fiddler&#xff0c;Postman有什么区别? Fiddler&#xff1a;虽然有接口测试功能&#xff0c;很少用来做接口测试。 一般用Fiddle来做抓包和异常测试&#xff0c;辅助接口测试。Postman&#xff1a; 是接口调试…...

Jmeter调用测试片段 —— 模块控制器

可以使用模块控制器调用测试片段。模块控制器提供了一种在运行时将测试片段替换为当前测试计划的机制。测试片段可以位于任何线程组中。 1、打开一个Jmeter窗口&#xff0c;添加好线程组、用户定义变量、模块控制器、测试片段、察看结果树。 2、用户定义变量同样定义好访问ip及…...