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

说明:

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

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

1.什么是深拷贝?什么是浅拷贝?

答案:

对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。

编译系统在我们没有自己定义拷贝构造函数时,会在拷贝对象时调用默认拷贝构造函数进行的是浅拷贝浅拷贝(释放时,因为多次释放出错,如果里面有指针就会出现不同对象对同一个内存进行是否)。

在对含有指针成员的对象进行拷贝时,必须要自己定义拷贝构造函数,使拷贝后的对象指针成员有自己的内存空间即进行深拷贝,这样就避免了内存出现两次释放发生。

总结:

浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,

深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

如何区分深拷贝深拷贝深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝;  如果B没变,那就是深拷贝!

2.什么是友元?

答案:

友元有两种形式:

友元函数:友元函数的声明,声明位置没有关系。

友元类:类中的有些成员只能通过类提供的函数进行访问,这会增加程序书写的麻烦,所以就搞了个友元friend,通过友元就可以访问类中的私有和保护成员。

缺点:破坏了类的封装性和数据的透明性

3.什么函数不能声明为虚函数

答案:

普通函数(非成员函数),静态成员函数,内联成员函数,构造函数,友元函数。

4.vector和list的区别有什么

答案:

vector底层是数组,List是双链表

vector支持随机访问,list不支持

vector是顺序内存

vecotr随机访问性能好,插入删除性能差,list相反

vecor一次性分配好内存,不够才被进行扩容,list每次插入一个节点都会进行内存申请

5.说一说vector扩容时发生了什么

答案:

  • vector空间已满时会申请新的空间并将原容器中的内容拷贝到新空间中,并销毁原容器
  • 存储空间的重新分配会导致迭代器失效

6.删除元素会导致迭代器发生什么变化

答案:

1) 对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响

2)对于序列式容器(如vector,deque),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。还好erase方法可以返回下一个有效的iterator。

3)对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的iterator,因此上面两种正确的方法都可以使用。

7.如何理解迭代器

答案:

迭代器类型主要支持两类,随机访问和双向访问。

其中vector和deque支持随机访问,list,set,map等支持双向访问。

8.假如给你一个class,让你去用class去实现一个智能指针,你会怎么做?

答案:

要实现一个智能指针,可以按照以下步骤进行:

  1. 创建一个类,作为智能指针的封装。这个类将管理底层指针,并提供安全和方便的操作。

  2. 在类中添加一个私有成员变量,用于存储底层指针。

  3. 实现构造函数,接受一个原始指针作为参数,并将其存储在私有成员变量中。可以在构造函数中对指针进行必要的检查和处理。

  4. 实现析构函数,用于在对象销毁时释放底层指针所占用的资源。这可以确保在不再使用智能指针时,底层资源得到正确释放。

  5. 重载箭头运算符(->)和解引用运算符(*),以模拟指针的行为。这样可以通过智能指针直接访问底层对象的成员或方法。

  6. 实现拷贝构造函数和赋值运算符重载,以确保在使用智能指针进行复制或赋值时,底层资源得到正确管理。一般情况下,需要使用引用计数来追踪底层资源的使用情况。

  7. 可以考虑实现其他辅助功能,如判空函数、获取原始指针的函数等。

  8. 对于多线程环境,需要考虑使用互斥锁和原子操作来确保智能指针的线程安全性。

9.STL中迭代器有什么用?有指针为何还有迭代器

答案:

10.map和set有什么区别?区别又是怎么实现的?

答案:

map和set都是c++的关联容器,底层都是红黑树

区别:

map中的元素是键值对,set只是关键字的集合,所以set中元素只包含一个关键字

set的迭代器是const,不允许修改元素的值

map允许修改value,但不允许修改key

原因:根据关键字来保证容器有序性,如果修改key的话,那么首先删除该建,然后调节平衡,再依据修改后的建值,调节平衡,这样一来破坏map和set的结构,iterator失效。

11.STL的allocator有什么作用

答案:

  1. 分配内存:allocator可以根据需要动态地分配内存,为容器中的对象分配存储空间。它能够根据对象类型的大小和对齐要求,有效地分配内存。

  2. 构造和销毁对象:allocator封装了对象的构造和销毁过程,使得在分配的内存空间上可以正确地构造对象并在使用完毕后销毁对象,确保内存的正确管理。

  3. 空间管理:allocator可以管理对象的内存空间,包括空间的分配、释放和重新分配,从而提供高效的内存管理方式。

  4. 抽象底层内存管理:allocator将内存分配的细节进行了抽象,使得容器类不需要关心具体的内存分配算法和实现细节,从而提高了代码的可移植性和灵活性。

12.STL中的MAP数据如何存放的

答案:

map是使用红黑树实现,unordered_map是使用hash表来完成映射功能。

map是按照operator<比较判断元素是否相同,及比较元素的大小,然后选择一个合适位置插入其中,所以对map遍历的话是有序的。

unordered_map是计算元素的hash值,根据hash的值判断元素是否相同,所以对unordered_map遍历是无序的。

最近更新

  1. TCP协议是安全的吗?

    2024-01-31 12:32:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-31 12:32:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-31 12:32:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-31 12:32:04       18 阅读

热门阅读

  1. Python - 整理 MySQL 慢查询日志

    2024-01-31 12:32:04       38 阅读
  2. Blender Object 的 name 字段不是 string

    2024-01-31 12:32:04       23 阅读
  3. C Primer Plus(第六版)14.17 复习题 第5题

    2024-01-31 12:32:04       26 阅读
  4. 【Spark系列5】Dataframe下常用算子API

    2024-01-31 12:32:04       28 阅读
  5. C++学习——模板类的使用:自定义数组

    2024-01-31 12:32:04       36 阅读
  6. C语言中大小写字母的转化

    2024-01-31 12:32:04       30 阅读
  7. 合并K个有序链表----链表OJ

    2024-01-31 12:32:04       38 阅读
  8. [Vue3] reactive数据改变,视图不更新的问题

    2024-01-31 12:32:04       25 阅读
  9. 走进CSS过渡效果的奇妙世界:详解CSS Transition

    2024-01-31 12:32:04       29 阅读
  10. 详解python opencv 归一化

    2024-01-31 12:32:04       36 阅读
  11. golang实现pdf中自动换行的表格

    2024-01-31 12:32:04       43 阅读