C++八股(面试题、手撕题)自用版

news2024/11/27 5:25:58

目录

面试题: 

1. define inline 在编译的哪个阶段

2. const static

3. 子函数返回结构体有什么问题,返回对象调用了哪些函数

4. volatile关键字

5. 编译器基本原理

6. 预处理、编译、汇编、链接以及他们在操作系统上如何运作的

7. 数组和指针(二维)

8. 指针和引用

9. new 和 malloc

10.万能引用和右值引用

11. 解释中断,以及底层发生的操作细节

12. C++多线程在操作系统上如何运作的

13. 进程、线程间通信方式

14. 信号量在操作系统中如何实现

15. 虚函数

16. 构造函数、析构函数

手撕题:

1. 内存池

2. lambda表达式

3. 手写单例模式

4. 遍历二叉树(非递归)


面试题: 

  1. define inline 在编译的哪个阶段
  2. const static
  3. 子函数返回结构体有什么问题,返回对象调用了哪些函数
  4. volatile关键字
  5. 编译器基本原理
  6. 预处理、编译、汇编、链接以及他们在操作系统上如何运作的
  7. 数组和指针(二维)
  8. 指针和引用
  9. new 和 malloc
  10. 万能引用和右值引用
  11. 解释中断,以及底层发生的操作细节
  12. C++多线程在操作系统上如何运作的
  13. 信号量在操作系统中如何实现
  14. 进程、线程间通信方式
  15. 虚函数
  16. 构造函数、析构函数

1. define inline 在编译的哪个阶段

define: 预编译/预处理

inline: 链接阶段

2. const static

经过static修饰的变量会作为类的属性而不是实体属性存在。它的作用是在编译时期确定,程序运行过程中不会改变。

static 关键字用于声明静态成员变量、静态成员函数和局部静态变量,其作用取决于它所修饰的实体。

  • 静态成员变量:静态成员变量是属于类的,而不是属于类的各个实例的。它的特点是所有类的实例共享同一份静态成员变量。静态成员变量可以通过类名直接访问,也可以通过对象访问。
  • 静态成员函数:静态成员函数是属于类的函数,它不依赖于任何特定的对象。因此,它可以直接通过类名来调用,而不需要创建类的实例
  • 局部静态变量:具有静态生存期,即它在程序运行期间只初始化一次,并且在函数调用结束后仍然存在于内存中。

const

const 关键字用于声明常量,它指定了一个变量在初始化后不能被修改的特性。const 可以用于变量、成员函数和指针。

3. 子函数返回结构体有什么问题,返回对象调用了哪些函数

typedef定义类型,因此返回return mm类似返回int这种基础操作,仅需声明函数时也声明结构体的类型。

也可以用指针

4. volatile关键字

volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

5. 编译器基本原理

6. 预处理、编译、汇编、链接以及他们在操作系统上如何运作的

1、预处理:

通过gcc -E main.c -o main.i    生成.i文件将进行如下操作:

1、将所有的#define删除,并展开所有的宏定义。

2、处理所有的预编译指令,例如:#if,#elif,#else,#endif等。

3、处理#include预编译指令,将被包含的文件插入到预编译指令的位置。

4、添加行号信息、文件名标识,便于调试。

5、删除所有的注释。

6、保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pargma指令来设定编译的状态或者是指示编译器完成一些特定的动作。

7、生成.i文件(包括去注释、宏替换、头文件展开、条件编译),编译生成的.i文件不包含任何宏定义,因为宏已经被展开,并且包含的文件已经被插入到.i文件中。

2、编译(C/C++语音 ------> 汇编):

通过gcc -S main.i –o main.s    生成.s文件,需要进行如下操作:

1、扫描、语法分析、语义分析、源代码分析、目标代码生成、目标代码优化。

2、生成汇编代码。

3、汇总符号。

4、生成.s文件。

3、汇编(汇编 ------> 二进制):

通过gcc –c main.s –o main.o   生成.o文件,需要进行如下操作:

1、根据汇编指令和特定平台,把汇编指令翻译成二进制形式。

2、合并各个section,合并符号表。

3、生成.o文件。

4、链接:

链接过程会进行如下操作:

1、合并各个.obj文件的section,合并符号表,进行符号解析。

2、符号地址重定位。

3、生成可执行文件。

7. 数组和指针(二维)

二维数组名是一个二级指针?

8. 指针和引用

指针大小固定,初始化需要分配内存,指针指向的地址可变

引用为变量的别名,需要初始化,初始化后不可改变

存在空值的指针,不存在空值的引用

9. new 和 malloc

new delete 操作符
malloc free 函数

常规八股

要了解new的底层需要熟悉operator操作符

10.万能引用和右值引用

涉及类型推导的引用,才会是万能引用。

对于万能引用,如果采用右值来初始化,得到的是一个右值引用,如果采用左值来初始化万能引用,那么得到的是一个左值引用。

左值引用能引用左值和右值,右值引用只能引用右值

Move的功能是将一个左值引用强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义,从实现原理上讲基本等同一个强制类型转换。

优点:可以将左值变成右值而避免拷贝构造,将对象的状态所有权从一个对象转移到另一个对象,只是转移,没有内存搬迁或者内存拷贝。

11. 解释中断,以及底层发生的操作细节

中断:CPU  终端服务程序

识别中断源、找到中断程序、保存当前任务的各个寄存器状态、进入中断处理程序后的返回等

...

对于外部中断,CPU在执行当前指令的最后一个时钟周期去查询INTR引脚,若查询到中断请求信号有效,同时在系统开中断(即IF=1)的情 况下,CPU向发出中断请求的外设回送一个低电平有效的中断应答信号,作为对中断请求INTR的应答,系统自动进入中断响应周期(即中断响应指令的指令周期)。

不太详细...

12. C++多线程在操作系统上如何运作的

  • 多线程实现:C++标准库提供了对多线程的支持,开发人员可以使用 std::thread 等类来创建和管理线程。C++11引入了对并发编程的支持,包括原子操作、互斥量、条件变量等,使得线程间的同步和通信更加方便。此外,还有一些其他的第三方库,如Boost.Thread等,也提供了丰富的多线程支持。
  • 多进程实现:在C++中,可以使用操作系统提供的系统调用或者一些跨平台的库来创建和管理多个独立的进程。例如,可以使用fork()系统调用来创建一个新的进程,或者使用exec()系列函数来在新的进程中执行其他程序。另外,一些跨平台的库,如Boost.Interprocess等,也提供了一些跨平台的进程间通信的工具,如共享内存、消息队列等。

构造函数作用是创建新线程并指定要执行的函数及其参数。可调用对象可以是以下五个中的任何一个:

  • 函数指针
  • Lambda 表达式
  • 函数对象(仿函数)
  • 非静态成员函数
  • 静态成员函数

13. 进程、线程间通信方式

管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。


命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。


消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。


共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。


信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。


套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。


信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

14. 信号量在操作系统中如何实现

15. 虚函数

通过基类访问派生类定义的函数。所谓虚函数就是在基类定义一个未实现的函数名,为了提高程序的可读性,建议后代中虚函数都加上virtual关键字。

其子类重新定义父类的做法这种行为成为覆盖(override),或者为重写。

  • override:保证在派生类中声明的重载函数,与基类的虚函数有相同的签名;
  • final:阻止类的进一步派生 和 虚函数的进一步重写。

在类的继承中,每一个class产生一堆指向virtual function的指针,放在vtbl(虚表)中。对于每一个class object 被添加了一个指针,指向相关的virtual table,这里指针称为vptr(虚指针)。

纯虚函数:

在基类中没有定义,但要求任何派生类都要定义自己的实现方法。作用:提供一个函数接口

virtual void funtion1()=0

含有纯虚函数的类叫做派生类

16. 构造函数、析构函数

析构函数于构造函数相对应,构造函数是对象创建的时候自动调用的,而析构函数就是对象在销毁的时候自动调用的的

当我们在类中声明了一些指针变量时,我们一般就在析构函数中进行释放空间,因为系统并不会释放指针变量指向的空间,我们需要自己来delete,而一般这个delete就放在析构函数里面

构造函数:

       1.构造函数是一种特殊的成员函数,不需要用户来调用,定义对象时被自动执行。

  2.构造函数名字与类名相同,无返回类型。

  3.可以由用户自己定义实现,根据需要设计对数据成员进行初始化,依旧可以设置函数的默认参数。

析构函数:清理工作,系统自动调用

       1.析构函数没有返回值,没有参数;

  2.没有参数,所以不能重载,一个类仅有一个析构函数;

  3.析构函数除了释放工作,还可以做一些用户希望它做的一些工作,比如输出一些信息。

手撕题:

 1.内存池初始化

释放

用户申请

用户释放

只能用两次malloc, 不能用stl

2.手写一个类实现lambda表达式

3. 手写单例模式

4. 后续遍历二叉树(非递归)

力扣hot100 + 面试150

1. 内存池

内存池(Memory Pool)是一种内存分配方式。通常我们习惯直接使用new、malloc等API申请内存,这样做的缺点在于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。

经典内存池实现过程
(1)先申请一块连续的内存空间,该段内存空间能够容纳一定数量的对象;
(2)每个对象连同一个指向下一个对象的指针一起构成一个内存节点(Memory Node)。各个空闲的内存节点通过指针形成一个链表,链表的每一个内存节点都是一块可供分配的内存空间;
(3)某个内存节点一旦分配出去,从空闲内存节点链表中去除;
(4)一旦释放了某个内存节点的空间,又将该节点重新加入空闲内存节点链表;
(5)如果一个内存块的所有内存节点分配完毕,若程序继续申请新的对象空间,则会再次申请一个内存块来容纳新的对象。新申请的内存块会加入内存块链表中。

C++ 内存池介绍与经典内存池的实现-CSDN博客

2. lambda表达式

手写一个类实现lambda表达式

3. 手写单例模式

4. 遍历二叉树(非递归)

再补充.....

还有其他常规C++八股总结:史上最全C/C++面试、C++面经八股文,一文带你彻底搞懂C/C++面试、C++面经!_c++八股-CSDN博客

C++八股文(基础面试题)_c++面试八股文-CSDN博客

参考:C/C++ : 函数返回值为结构体,以及返回指针_c++ 返回结构体-CSDN博客 C++基础重点:static和const关键字 - 知乎 (zhihu.com)C++中static、const、static const修饰变量作用详解_const static-CSDN博客编译的四个过程-预处理、编译、汇编、链接-阿里云开发者社区 (aliyun.com)CPU中断的工作原理,从最底层讲起_用逻辑门实现三选一-CSDN博客C++中的线程:完整指南 - 知乎 (zhihu.com)进程间通讯的7种方式_进程间通信的几种方法-CSDN博客  C++虚函数详解-CSDN博客C++ 内存池介绍与经典内存池的实现-CSDN博客  C++构造函数和析构函数详解 - 知乎 (zhihu.com)    析构函数-CSDN博客

大部分内容直接粘贴过来的

侵删

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

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

相关文章

【HCIP学习】BGP对等体组、聚合、路由反射器、联盟、团体属性

一、大规模BGP网络所遇到的问题 BGP对等体众多,配置繁琐,维护管理难度大 BGP路由表庞大,对设备性能提出挑战 IBGP全连接,应用和管理BGP难度增加,邻居数量过多 路由变化频繁,导致路由更新频繁 二、解决大…

【python量化交易】qteasy使用教程07——创建更加复杂的自定义交易策略

创建更加复杂的自定义交易策略 使用交易策略类,创建更复杂的自定义策略开始前的准备工作本节的目标继承Strategy类,创建一个复杂的多因子选股策略策略和回测参数配置,并开始回测 本节回顾 使用交易策略类,创建更复杂的自定义策略 …

mapreduce | 自定义Partition分区(案例2)

1.需求 统计每个手机号消费总金额,按照消费金额降序排序,最终联通、电信、移动分别写入不同的文件。 130、131、132(联通) 133(电信) 135、136、137、138、139 (移动) 手机号,消费记…

MFC编程之设计美丽的对话框

目录 写在前面: Part 1:美美的设计一下计算器的布局 1.描述文字: ​编辑 2.ID: Part 2:美美熟悉一下计算器的工作流程 Part 3:美美设计一下控件功能 1.edit control: 2.相关变量初始化&…

2.分布式-算法

目录 一、限流算法有哪些? 1.计数器算法(Counter-Based Algorithm) 2.固定窗口算法(Fixed Window) 3.滑动窗口算法(Sliding Window) 4.令牌桶算法(Token Bucket) 5.…

PyQt5中的QtDesigner窗口

文章目录 1. 简介2. QtDesigner的MainWindow2.1 创建MainWindow2.2 添加组件2.3 预览2.4 查看对应的Python代码2.5 保存窗口并命名为login.ui,如下所示2.6对ui文件进行转换得到.py原件 3. 窗口常用属性及说明3.1 设置对象名称3.2 改变标题名字3.3 修改窗口大小 4. 更…

pdf 版面分析与优化策略

1. 简介 版面分析作为RAG的第一步工作,其效果对于下游工作至关重要。 前常见的 PDF 解析方法包括三种 基于规则:根据 PDF 的组织特征确定每个部分的规则(风格和内容)缺点:不通用(PDF格式不固定&#xf…

DSA理解理解蓝桥杯例题signature

一、历史 1991年8月,NIST(Nation Institute of Standards and Technology,美国国家标准技术研究所)提出了数字签名算法(DSA)用于他们的数字签名标准(DSS)中。 DSA是算法&#xff0c…

C++的数据结构(四):队列

在数据结构中,队列(Queue)是一种特殊的线性表,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。队列中没有元素时,称为空队列。队列的…

python数据分析——matplotlib可视化基础

参考资料:活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt # 导入数据 anscombepd.read_csv(r"...\seaborn常用数据案例\anscombe.csv") anscombe.head() 大多数基本图表的名字以plt.plot开头。 # 创建数据子集 # 只包含数…

消息中间件Kafka(PHP版本)

小编最近需要用到消息中间件,有需要要复习一下以前的东西,有需要的自取,强调一点,如果真的想了解透彻,一定要动手,脑袋会了不代表就会写了 Kafka是由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅…

py黑帽子学习笔记_环境准备

1 下载os装os 下载一个kali虚机镜像然后用虚机管理软件创虚机,装完如下图,我用的版本是2024.1的版本kali-linux-2024.1-installer-amd64,可以从镜像站下载,官网下的慢还断网Index of /kali-images/kali-2024.1/ | 清华大学开源软…

AI 问答 API 对接说明

我们知道,市面上一些问答 API 的对接还是相对没那么容易的,比如说 OpenAI 的 Chat Completions API,它有一个 messages 字段,如果要完成连续对话,需要我们把所有的上下文历史全部传递,同时还需要处理 Token…

47岁古天乐唯一承认女友约「御用阿妈」过母亲节

日前关宝慧在IG晒出一张聚会照,并写道:「预祝各位#母亲节快乐🌹#dinner #happy #friends #好味」相中所见,前TVB金牌监制潘嘉德、卢宛茵、黄𨥈莹、黎萨达姆都有出席饭局。 当中黄𨥈莹身穿卡其色西装褛&…

【35分钟掌握金融风控策略24】定额策略实战

目录 基于客户风险评级的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于客户风险评级的定额策略 在开发定额策略时,精准确定客户的基础额度是一个关键步骤,通常会基于客户的收…

整体安全设计

人员和资产的安全是当今许多组织的最高优先事项之一。随着暴力事件在美国各地盛行——枪击事件、袭击、内乱等——建筑物业主必须为其建筑物及其居住者的安全做好计划。 为了创造一个安全的环境,新设施或园区的安全设计必须超越基本的摄像头和访问控制设备&#xf…

纯血鸿蒙APP实战开发——首页下拉进入二楼效果案例

介绍 本示例主要介绍了利用position和onTouch来实现首页下拉进入二楼、二楼上划进入首页的效果场景,利用translate和opacity实现动效的移动和缩放,并将界面沉浸式(全屏)显示。 效果图预览 使用说明 向下滑动首页页面超过触发距…

【Linux】centos7安装软件(rpm、yum、编译安装),补充:查找命令的相关文件路径,yum安装mysql

【Linux】技术上,Linux是内核。而术语上,我们通常说的Linux是完整的操作系统,其实称为"Linux发行版",是将Linux内核和应用系统打包,由不同的发行家族发行了不同版本。Linux发行版众多,主要有RedH…

HCIP-Datacom-ARST自选题库_07_割接【35道题】

一、单选题 1.在割接的测试阶段,符合以下哪一种情况的可以判断为割接成功? 网络承载的上层应用业务测试正常 网络设备的配置查看结果正常 网络流量路径正常 路由协议运行正常 2.在割接的测试阶段中,表明已经完成测试的标准是: IP设备的配置查看结…

org.postgresql.util.PSQLException: 错误: 关系 “dual“ 不存在

springboot 项目连接 postgreps,启动时报错 org.postgresql.util.PSQLException: 错误: 关系 "dual" 不存在。 查阅资料后发现这是由配置文件中的配置 datasource-dynamic-druid-validationQuery 导致的 spring:datasource:druid:stat-view-servlet:ena…