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

说明:

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

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

 

 

1.C++structclass的区别

答案:

相同点
两者都拥有成员函数、公有和私有部分。
任何可以使用class完成的工作,同样可以使用struct完成。
不同点
两者中如果不对成员不指定公私有,struct默认是公有的,class则默认是私有的。
class默认是private继承,而struct模式是public继承。
引申:C++和C的struct区别
1. C语言中:struct是用户自定义数据类型(UDT);C++中struct是抽象数据类型(ADT),支持成员函数的定义,(C++中的struct能继承,能实现多态)
2. C中struct是没有权限的设置的,且struct中只能是一些变量的集合体,可以封装数据却不可以隐藏数据,而且成员 不可以是函数
3. C++中,struct增加了访问权限,且可以和类一样有成员函数,成员默认访问说明符为public(为了与C兼容)
4. struct作为类的一种特例是用来自定义数据结构的。一个结构标记声明后,在C中必须在结构标记前加上struct,才能做结构类型名(除:typedef struct class{};);C++中结构体标记(结构体名)可以直接作为结构体类型名使用,此外结构体struct在C++中被当作类的一种特例

2.数组名和指针(这里为指向数组首元素的指针)区别?

答案:
二者均可通过增减偏移量来访问数组中的元素。
数组名不是真正意义上的指针,可以理解为常指针,所以数组名没有自增、自减等操作。
当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作, sizeof 运算符不能再得到原数组的大小了。

3.finaloverride关键字

答案:
override
当在父类中使用了虚函数时候,你可能需要在某个子类中对这个虚函数进行重写,以下方法都可以:
class A
{virtual void foo();
}
class B : public A
{void foo(); //OKvirtual void foo(); // OKvoid foo() override; //OK
}
如果不使用override,当你手一抖,将 foo()写成了 f00()会怎么样呢?结果是编译器并不会报错,因为它并不知道你的目的是重写虚函数,而是把它当成了新的函数。如果这个虚函数很重要的话,那就会对整个程序不利。所以,override的作用就出来了,它指定了子类的这个虚函数是重写的父类的,如果你名字不小心打错了的话,编译器是不会编译通过的。
final
当不希望某个类被继承,或不希望某个虚函数被重写,可以在类名和虚函数后添加final关键字,添加final关键字后被继承或重写,编译器会报错。
class Base
{virtual void foo();
};
class A : public Base
{void foo() final; // foo 被override并且是最后一个override,在其子类中不可以重写
};
class B final : A // 指明B是不可以被继承的
{void foo() override; // Error: 在A中已经被final了
};
class C : B // Error: B is final
{
};

4.拷贝初始化和直接初始化

答案:
当用于类类型对象时,初始化的拷贝形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数。拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个临时对象拷贝到正在创建的对象。
string str1("I am a string");//语句1 直接初始化
string str2(str1);//语句2 直接初始化,str1是已经存在的对象,直接调用构造函数对str2进行初始
化
string str3 = "I am a string";//语句3 拷贝初始化,先为字符串”I am a string“创建临时对象,
再把临时对象作为参数,使用拷贝构造函数构造str3
string str4 = str1;//语句4 拷贝初始化,这里相当于隐式调用拷贝构造函数,而不是调用赋值运算符
函数

为了提高效率,允许编译器跳过创建临时对象这一步,直接调用构造函数构造要创建的对象,这样就完全等价于直接初始化了(语句1和语句3等价),但是需要辨别两种情况。

  • 当拷贝构造函数为private时:语句3和语句4在编译时会报错
  • 使用explicit修饰构造函数时:如果构造函数存在隐式转换,编译时会报错

5.野指针和悬空指针

答案:
都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。
野指针: 指的是没有被初始化过的指针 。
因此,为了防止出错,对于指针初始化时都是赋值为 nullptr,这样在使用时编译器就会直接报错,
产生非法内存访问。
悬空指针: 指针最初指向的内存已经被释放了的一种指针。 
产生原因及解决办法:
野指针:指针变量未及时初始化 => 定义指针变量及时初始化,要么置空。
悬空指针:指针free或delete之后没有及时置空 => 释放操作后立即置空。

6.C++中的重载、重写(覆盖)和隐藏的区别

答案:
(1)重载(overload)
重载是指在同一范围定义中的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数。重载和函数成员是否是虚函数无关。
(2)重写(覆盖)(override)
重写指的是在派生类中覆盖基类中的同名函数, 重写就是重写函数体要求基类函数必须是虚函数且:
与基类的虚函数有相同的参数个数
与基类的虚函数有相同的参数类型
与基类的虚函数有相同的返回值类型
(3)隐藏(hide)
隐藏指的是某些情况下,派生类中的函数屏蔽了基类中的同名函数,包括以下情况:
两个函数参数相同,但是基类函数不是虚函数。 和重写的区别在于基类函数是否是虚函数。
   两个函数参数不同,无论基类函数是不是虚函数,都会被隐藏。和重载的区别在于两个函数不在  同一 个类中。

7.mutableexplicit关键字的用法

答案:
mutable
mutable的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要 const 函数里面修改一些跟类状态无关的数据成员,那么这个函数就应该被 mutable 来修饰,并且放在函数后后面关键字位置
explicit
explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以 显示的方式进行类型转换,注意以下几点:
  • explicit 关键字只能用于类内部的构造函数声明上
  • explicit 关键字作用于单个参数的构造函数
  • 被explicit修饰的构造函数的类,不能发生相应的隐式类型转换

8.什么情况下会调用拷贝构造函数

答案:
  • 用类的一个实例化对象去初始化另一个对象的时候
  • 函数的参数是类的对象时(非引用传递)
  • 函数的返回值是函数体内局部对象的类的对象时 ,此时虽然发生(Named return Value优化)NRV优化,但是由于返回方式是值传递,所以会在返回值的地方调用拷贝构造函数

9.形参与实参的区别?

答案:
1) 形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
2) 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值,会产生一个临时变量。
3) 实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
4) 函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
5) 当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。

10.值传递、指针传递、引用传递的区别和效率

答案:
1) 值传递:有一个形参向函数所属的栈拷贝数据的过程,如果值传递的对象是类对象 或是大的结构体对象,将耗费一定的时间和空间。(传值)
2) 指针传递:同样有一个形参向函数所属的栈拷贝数据的过程,但拷贝的数据是一个固定为4字节的地址。(传值,传递的是地址值)
3) 引用传递:同样有上述的数据拷贝过程,但其是针对地址的,相当于为该数据所在的地址起了一个别名。(传地址)
4) 效率上讲,指针传递和引用传递比值传递效率高。一般主张使用引用传递,代码逻辑上更加紧凑、清晰。

11.delete pdelete [] pallocator都有什么作用?

答案:
1、 动态数组管理new一个数组时,[]中必须是一个整数,但是不一定是常量整数,普通数组必须是一个常量整数;
2、 new动态数组返回的并不是数组类型,而是一个元素类型的指针;
3、 delete[]时,数组中的元素按逆序的顺序进行销毁;
4、 new在内存分配上面有一些局限性,new的机制是将内存分配和对象构造组合在一起,同样的, delete也是将对象析构和内存释放组合在一起的。allocator将这两部分分开进行,allocator申请一部分内存,不进行初始化对象,只有当需要的时候才进行初始化操作。

12.malloc申请的存储空间能用delete释放吗?

答案:
不能,malloc /free主要为了兼容C,new和delete 完全可以取代malloc /free的。
malloc /free的操作对象都是必须明确大小的,而且不能用在动态类上。
new 和delete会自动进行类型检查和大小,malloc/free不能执行构造函数与析构函数,所以动态对象它是不行的。
当然从理论上说使用malloc申请的内存是可以通过delete释放的。不过一般不这样写的。而且也不能保证每个C++的运行时都能正常。

 

 

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

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

相关文章

老龄化对投资意味着什么?

1月15日,国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措,为我国首个以“银发经济”命名的政策文件。 近期,国信证券分析师王开发布题为《银发经济再思考:老龄化对投资的影响》的报告&#xff0…

小程序学习-23

开始做uni-app开发项目 安装了HBuilder X,具体可参考 1. 起步 | uniapp - 黑马优购xx​​​​​​​x 学到P97 转战vue,加油! 坚持就是胜利

Hive(15)中使用sum() over()实现累积求和和滑动求和

目的: 三个常用的排序函数row_number(),rank()和dense_rank()。这三个函数需要配合开窗函数over()来实现排序功能。但over()的用法远不止于此,本文咱们来介绍如何实现累计求和和滑动求和。 1、数据介绍 三列数据,分别是员工的姓名、月份和…

异步控制并发数

异步控制并发数通常用于限制同时进行的异步操作数量,以避免资源过度占用或网络请求过多导致的性能问题。在 JavaScript 中,可以使用 Promise、async/await 等语法来实现异步控制并发数。 下面是一个简单的示例代码,实现了同时执行3个异步操作…

源聚达科技:开一家抖音店铺怎么做最好

在数字化浪潮的推动下,抖音不仅是年轻人展示才华的舞台,也成为商家争夺流量的新阵地。开一家抖音店铺,看似简单,实则需要精心策划和周到运营。 首要任务是确立店铺定位。正如古人云“磨刀不误砍柴工”,明确目标受众和主…

神经网络建立(结果可变)最小神经元

目录 介绍: 初始化: 建模: 预测: 改变结果: 介绍: 在深度学习中,神经元通常指的是人工神经元(或感知器),它是深度神经网络中的基本单元。深度学习的神经元模拟了生…

JavaWeb基础01-基本技术体系介绍和相关工具的安装

一、JavaWeb 1.概述 Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站JavaWeb:是用Java技术来解决相关web互联网领域的技术栈 2.组成 (1)网页:展示数据(前端技术&…

计算机网络·网络层

网络层 网络层提供的两种服务 争论: 网络层应该向运输层提供怎样的服务?面向连接还是无连接? 在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统? 2 种观点: 面向连接的可靠交付。 无连…

【C\C++ 04】归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,也是用空间换时间思维的体现。 将已有序的子序列合并,得到完全有…

w24文件上传之PHP伪协议

PHP支持的伪协议 file:// - 访问本地文件系统 http:// - 访问网址 ftp:// - 访问文件 php:// -访问各个输入/输出流 zlib:// -压缩流 data:// - 数据 glob:// -查找匹配的文件路径模式 phar:// - php归档 ssh2:// - Secure shell 2 rar:// - RAR ogg:// - 音频流 expect:// - …

软件个性化选型:制造企业如何选择适合自身的工单管理系统-亿发

企业制造业是实体经济中非常重要和基础的组成部分,直接关系到国家经济的血脉。然而,传统制造业在生产与管理上所采用的老一套方法和经验已不再适应当下的发展需求。信息化、数字化和智能化被视为制造企业的必然趋势。要想在竞争激烈的市场中永立潮头&…

K8S、keepalived、haproxy 高可用集群实战

K8S、keepalived、haproxy 高可用集群实战 环境:Centos7.6、2个CPU、8G内存以上配置 Master1:172.20.26.24 Master2:172.20.26.86 Master3:172.20.26.89 Node1: 172.20.26.104 VIP :172.20.26.201 在master1、2、3、Node1上…

diff命令详解

diff是Unix系统的一个很重要的工具程序。 它用来比较两个文本文件的差异&#xff0c;是代码版本管理的基石之一。你在命令行下&#xff0c;输入&#xff1a; $ diff < 变动前的文件 > < 变动后的文件 >; diff就会告诉你&#xff0c;这两个文件有何差异。它的显示结…

web前端---------盒子模型

1.内容 盒子的内容可以包含文字、图片等多种类型。 浏览器在加载网页时&#xff0c;会将元素按照内容区分为替换元素与非替换元素。 &#xff08;1&#xff09;替换元素指的是HTML中的一些形如<img>、<input>等非文本元素。 这些元素本身不包含任何内容&#x…

小周学JAVA—八股三

当问到多线程时候如何解决线程安全的问题时候&#xff0c;大部分人都知道加锁。提到锁最先接触到的就是Synchronized关键字。 当我们想要保证一个共享资源在同一时间只会被一个线程访问到时&#xff0c;我们可以在代码中使用synchronized关键字对类或者对象加锁 synchronized…

容器和虚拟机的对比

容器和虚拟机的对比 容器和虚拟机在与硬件和底层操作系统交互的方式上有所不同 虚拟化 使多个操作系统能够同时在一个硬件平台上运行。 使用虚拟机监控程序将硬件分为多个虚拟硬件系统&#xff0c;从而允许多个操作系统并行运行。 需要一个完整的操作系统环境来支持该应用。…

企业为何对数据可视化越发看重?

数据可视化&#xff0c;作为信息时代的一项重要技术&#xff0c;正在企业中崭露头角&#xff0c;逐渐成为业务决策和运营管理的得力助手。企业之所以对数据可视化如此重视&#xff0c;是因为它为企业带来了诸多实际利益和战略优势。 首先&#xff0c;数据可视化为企业提供了更…

JVM面试合集

前言 前文介绍了数据库、中间件相关。本期我们继续学习Java特性的JVM。 JVM面试合集 JVM的架构组成是怎样的&#xff1f; JVM主要由**类加载器&#xff08;ClassLoader&#xff09;、运行时数据区&#xff08;Runtime Data Area&#xff09;、执行引擎&#xff08;Execution…

如何实现无公网ip远程SSH连接家中本地的树莓派

文章目录 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地址4.5 ssh公网…

word文档怎么做成翻页电子书

随着科技的进步&#xff0c;电子书已成为越来越多人阅读的首选。翻页电子书以其独特的翻页效果和丰富的互动功能&#xff0c;更是受到了广大读者的喜爱。那么&#xff0c;如何将传统的Word文档制作成翻页电子书呢&#xff1f; 一、了解翻页电子书的特点 翻页电子书&#xff0c…