C++高频八股总结

超高频:

1智能指针.

我一般先说智能指针是什么,再具体介绍

比如,智能指针是帮助程序员管理动态分配资源的一种工具,主要就是防止程序员忘记释放堆上资源导致的内存泄漏,本质是一个类模板,可以动态的分配任何类型的资源,在析构函数中在合适的时机释放该资源。

具体分为unique_ptr(我喊独占指针或者unique pointer),shared_ptr(共享指针,shared pointer)和weak_ptr

独占指针就是同一时刻只能有一个指针指向动态分配的资源,内部禁止拷贝和赋值,但有移动构造函数

相反的,共享指针就是同一时刻可以有多个指针指向同一个动态分配的资源,内部通过一个引用计数表示该资源被多少个指针指向。当一个共享指针离开作用域,会将引用计数减一,引用计数为0才真正释放资源。

为了解决共享指针的循环引用问题 引入了Weak pointer,(不要主动展开循环引用,真的很难用文字表达!) 一个弱指针指向一个共享的对象时不会增加引用计数。细节我也不太理解 可以看这个贴子https://blog.csdn.net/sinat_31608641/article/details/107702175

 

2 vector和list

一般先简单介绍,说说相同点,然后说区别

比如,vector和list都是一个用来存放相同元素的集合

不同点就 vector内存中连续存放,随机访问,插入删除复杂度高

List不连续,链表形式存放,插入删除复杂低

3 new 和malloc

没什么好说的,百度就行,也可以先说相同点,都是用来动态分配内存的,new要先调用operator new再调用构造函数 而operator new函数里面其实用的也是malloc

4 讲讲多态

多态就是一个接口有多种形态,C++中有静态多态,动态多态,静态多态是函数重载和模板

你要重点讲动态多态,从继承、虚函数,虚函数表来讲

比如:多态一般指动态多态,C++是通过虚函数实现,具体的就,只要含有虚函数的类就会为该类生成一个全局唯一虚函数表,虚函数表中记录类中虚函数的入口地址,同时会在每个实例内存的开始生成一个虚函数表指针,指向虚函数表。

而当一个子类继承一个有虚函数的父类后,同时也会继承父类的虚函数表,如果子类重写了一个虚函数,就会把虚函数表中该虚函数的地址改成重写后的版本。

这样一个父类指针指向一个子类对象,想要调用某虚函数时,通过对象内存地址找到的是子类虚函数表,就可以调用子类的版本。这就实现了多态,即一个父类指针指向不同对象,调用相同的函数,表现出不同的形态。

5. 指针和引用

百度就行

6 进程通信

我一般先说最简单的 管道:匿名管道,命名管道,再讲讲特点 什么半双工,一端读一端写,。匿名管道用于有血缘关系的进程之间,代码里用pipe+fork  常见的 终端中的 管道符|

命名管道就是 内核缓冲区特殊的文件 没有关系也能通信

然后说管道效率低 ,数据流没有格式巴拉巴拉,就有了消息队列, 消息队列可以存完就走,定义消息头消息体 巴拉巴拉。

然后说消息队列效率还是低,引入了共享内存,将两个进程的虚拟地址映射到同一块物体内存,这样访问到同一个地址进行通信。直接操作内存效率高,但是要考虑同步和互斥等问题

后面什么信号,socket简单讲讲

7 static关键字

百度就行, 笔试时我一般这么写

静态全局变量:   将全局变量隐藏, 在外部文件不能访问该全局变量

静态局部变量:   将局部变量存储在 静态存储区, 生命周期 扩大为整个程序的生命周期

静态成员变量:   该成员变量为类中所有对象共有,类外初始化,全局唯一, 不需要实例化即可访问

静态成员方法:   只能访问静态成员变量,没有this指针

8 内存分区

百度就行

9 C++11新特性

百度就行。右值,右值引用,移动构造必须会。其他匿名函数,auto等等

高频:

10静态链接,动态链接

还会问你适用场景。

你得先熟悉 编译的四个步骤 预处理,编译,汇编,链接。最后一步就是二进制库文件放进来。使用静态链接得先生成静态库,将一个cpp文件生成,里面一般就一些函数。静态链接就把所有函数全放到可执行文件中,所以可执行文件大一些。

动态链接就是你生成库之后,可指向文件中记录下动态库函数的信息,运行可执行文件后,再从动态库中加载库函数,其实就是一行行代码,动态库一般加载在堆区和栈区中间好像。

适用场景就说说优缺点,更新一个静态库后,还得重新链接生成可执行文件。动态链接更新了一般就不用。 但是动态链接因为要加载,所有运行会慢。静态链接体积大,浪费内存。同样的代码,会在很多可执行文件中存在

11 进程同步

百度就行

12 析构函数能不能虚函数

不能。要清楚是在多态的情况下不能,一个父类指针指向子类对象叫多态。如果子类中有新成员变量而析构函数不是虚函数,调用的就是父类的析构函数,导致子类新对象得不到释放。

13 进程和线程

百度就行。多加自己理解,不要硬背分配资源最小单位,cpu调度最小单位。比如,进程就是可执行程序一次运行,最初只有进程,但是进程通信效率低,所以引入线程让cpu调度,粒度更低。一个进程有多个线程组成。然后就 进程共享什么,线程共享什么,多进程多线程,巴拉巴拉。

14 struct和union

15 编译四步,每步干什么

16 #define const

17 迭代器失效

关注vector扩容。

18 extern

两个作用: 表示声明。当你想用某个变量,但定义在其他地方,就可以先声明一下,编译就不会报错。链接的时候就能找到了

还有C++用C,和C用C++,百度百度,自己尝试实现就能理解

 

剩下的都是 频率不多也不少的比如, 内联函数,怎么禁止动态分配内存,怎么在栈上动态分配内存,map,set,unordered_map底层,单例模式,一些锁,等等  https://interviewguide.cn/  https://www.iamshuaidi.com/ 这两个八股网站建议多刷刷。C++还会问很多linux知识。还会问gdb,内存泄漏检测等等考验你有没有实际经历.还有其他一些刁钻的八股就纯看能力了。

 

 

 

webserver项目方面:

常见的epoll底层,epoll,select,pool肯定要会,其他http,报文结构,字段,tcp ,udp常见的网络知识肯定要会。其他还有

三次握手,四次挥手怎么体现

你服务端开启后,就一直监听嘛,直到一个客户端调用connect,然后你accept得到一个fd。实际上,不管有没有accept,三次握手内核已经帮你完成,可以通过netstat等和代码配合查看出来。你调用accept只是将这次连接从tcp全连接队列取出来。

关闭连接时,一端调用close,另一端内核自动接收这个报文,处于close_wait状态,然后代码中判断出来对方关闭,自己也调用close。里面细节很多,可以自己多研究。

向已经关闭的tcp连接发送数据

这个涉及缓冲区和sigpipe信号。

Tcp是有缓冲区的,你send是写到缓冲区里,缓冲区没满就能写,就正常返回。Read读缓冲区,缓冲区有数据就能读。

我自己测试发现,当对端关闭了,你调用send,这时可以正常返回,实际只是写到缓冲区中。然后内核尝试发送,然后发现不能发送。你再一次send,内核已经知道了,就产生sigpipe信号,进程崩掉。

 

以上内容纯属个人理解,不保证正确。

#C++##八股##秋招总结##秋招加油#
全部评论
12错了,其他大部分还行
11 回复 分享
发布于 2023-02-12 09:30 上海
强!这个我爱了
3 回复 分享
发布于 2023-01-24 21:08 福建
想问下这些八股涉及的操作,比如进程通信那边,这些背诵都是建立在实操过的基础上吗?
2 回复 分享
发布于 2023-01-28 07:48 江苏
1 回复 分享
发布于 2023-01-20 01:46 浙江
楼主这样写好歹给个链接呀,直接百度又要去找一大堆
点赞 回复 分享
发布于 2023-12-20 15:09 广东
太强了
点赞 回复 分享
发布于 2022-12-26 20:18 安徽

相关推荐

联想数据开发工程师面经(2025届校招/实习)📌 背景:985本硕,计算机相关专业,有大数据项目经历,面试岗位为数据开发工程师(Base北京/上海)。📝 面试流程 & 问题回顾1. 笔试(线上编程+SQL)- 题型:- 算法题(LeetCode中等难度,考察数组、字符串、动态规划)- SQL题(多表关联、窗口函数、复杂查询优化)- 大数据基础(Hadoop/Spark原理简答)2. 技术一面(1小时)- 数据结构与算法- 手撕代码:合并K个有序链表(优先队列实现)- 时间复杂度分析,如何优化?- 大数据生态- Spark和Hadoop的区别?Spark为什么更快?- 数据倾斜的解决方案?- SQL实战- 写一个**连续登录用户统计**的SQL(使用窗口函数)- 项目深挖- 介绍一个大数据项目,你在其中负责什么?- 如果数据量增加10倍,如何优化你的方案?3. 技术二面(45分钟)- 系统设计- 设计一个实时数据仓库,如何保证低延迟和高可用?- Kafka和Flink在实时计算中的作用?- 数据库- MySQL索引原理,B+树 vs Hash索引- Hive内部表和外部表的区别?- 场景题- 如果某天发现报表数据异常,如何排查?4. HR面(30分钟)- 职业规划、为什么选择联想?- 对加班/出差的看法?- 期望薪资?💡 面试建议1. **重点复习**:SQL(窗口函数、优化)、Spark/Hadoop原理、常见大数据场景题。2. **项目复盘**:确保能清晰讲解技术选型、难点和优化思路。3. **算法刷题**:LeetCode热题100+剑指Offer,尤其是**链表、树、DP**。4. **反问环节**:可以问团队业务、技术栈、新人培养计划等。🌟 联想数据团队体验- 技术氛围浓厚,大牛导师带教,内部有完善的大数据平台。- 业务覆盖智能供应链、用户行为分析、风控建模等,实战性强!📢 投递Tips:联想对代码能力+大数据基础要求较高,建议尽早投递!📅 【投递链接】春招:https://talent.lenovo.com.cn/position?projectType=1暑期实习:https://talent.lenovo.com.cn/position?projectType=2【内推码】2025XZLMCX【内推入口】在“联想校招官网”投递校招职位,创建简历时“从哪儿获知招聘信息”选择“联想员工推荐”并且输入推荐人ITcode:2025XZLMCX投递的同学评论区留下【姓名缩写+岗位】,方便及时跟进加入联想,与创新者同行,用科技改变世界!(欢迎留言交流,祝大家offer多多!🎯) #内推#      内推码      #联想#      26届      #26届实习交流#      数据人的面试交流地   
点赞 评论 收藏
分享
03-25 13:40
四川大学 Java
1.https加密解密流程。    tcp,http,ftp分别属于那一层。2.解释linux中的交换空间(swap space),如何查看和管理交换空间。    软连接 和 硬链接,区别。         什么是SSH,如何用ssh连接到远程服务器。3.解释left join ,right join 和inner join的区别。4.解释java中的线程,如何创建和启动一个新线程。5.什么是java中的String类,String对象是不可变的,如何理解。6.为社交媒体应用设计一个热门话题功能,如何统计和展示热门话题。    设计一个用户的关注系统,如何高效的获取导关注列表和粉丝列表。    设计一个预约时间段的系统,如何设计预约时间段的管理 和 冲突检测。    -->如何处理预约取消和修改的情况,以避免系统可以正确的更新和避免新的冲突.7.如何跟上软件开发的最新技术趋势,有哪些学习渠道。不同渠道的学习效果如何。    -->分享一个具体的实际案例,通过这些渠道来学习一个新技术或解决一个实际问题的呢    -->遇到复杂的概念时,如何判断你对这些概念的理解是否足够深入。分享一下如何巩固和验证这些知识。8.在项目中遇到最有挑战性的问题,如何识别并最终解决这个问题的。    -->如何评估不同的解决方法的优劣,并终止采用这次方案。说一下思考过程。    -->如何判断哪些网上的信息是值得信赖的,哪些是需要再验证的呢。说一下如何筛选和验证的信息的过程。9. 未来三年的职业规划。每个题目有两次换题的机会,通用题不能换题时长半个小时,感觉自己答得很混乱,没有逻辑性,很多重复的话术,断断续续的。之后发现好几个问题都答非所问,还是要认真听题读题
查看19道真题和解析
点赞 评论 收藏
分享
投票
Yki_:实习不是军备竞赛啦,不是段数越多越好,找着一个就可以了
点赞 评论 收藏
分享
评论
86
783
分享

创作者周榜

更多
牛客网
牛客企业服务