-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathccpp面试八股文笔记
200 lines (154 loc) · 7.79 KB
/
ccpp面试八股文笔记
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
一,c/c++语言
1.什么是指针?指针的作用是什么?
指针是存放地址的变量
作用:1.动态分配内存2.传地址方式传递参数3.形成复杂的数据结构4.实现函数回调
2.C++中const关键字有哪些应用场景?
常量:增强可读性,可维护性
函数形参:防止函数修改变量
成员函数:不会修改对象状态
返回值:防止被修改
3.什么是虚函数?为什么需要虚函数?
带有virtual的成员函数
可以覆盖基类同名函数,实现多态
4.何为内存泄漏?如何避免?
申请内存不释放导致资源耗尽
1.及时释放2.避免重复释放3.智能指针自动管理4.错误流程覆盖
5.什么是引用?和指针有什么区别?
引用是别名
区别1.指针可为空,引用不行2.指针可以改地址,引用不行3.指针可以多级,引用不行4.指针取地址获得指针的指针,引用取地址获得原变量指针
6.什么是OOP?有何特点?
面向对象编程oop,程序设计范式,将数据和处理封装在函数内部,实现数据抽象,信息隐藏,代码重用
抽象:抽象行为和属性
封装:隐藏处理方式
继承:继承基类提高代码复用
多态:派生代替基类使用
7.什么是模板?模板有哪些特点?
泛型编程技术,允许编译时生成代码,支持多种类型,多种形参
特点1.泛型:任意数据作为参数,提高通用性和灵活性2.模板参数:多种参数类型,满足不同需求3.编译时生产:避免额外开销4.重载:根据不同参数匹配不同模板
8.c++多继承是什么?有何特点?
一个类有多个父类
多个基类继承属性和方法,实现代码复用
虚继承避免菱形继承
更难,需要处理多个父类命令冲突
维护调试更难
9.何为STL?有哪些组成部分?
标准模版库
容器:vector,list,set...
迭代器:可以遍历元素
算法:通用算法,排序,查找,遍历...
10.智能指针是什么?有何类型?
rall机制技术,可以自动管理内存
unique_ptr:独占式指针,只能指向某个对象,离开自动释放
shared_ptr:共享指针,多个指针指向一个对象,使用计数器管理内存,最后一个指针离开才释放
weak_ptr:弱引用指针,解决shared_ptr循环引用问题,不增加计数器,不能直接访问对象,使用lock()获取一个shared_ptr
二,数据结构算法
1.什么是哈希表?
哈希表=散列表
根据关键字直接访问位置
2.如何解决哈希冲突?
两个或以上关键字映射到同一位置
常见解决办法:1.链地址法:每个位置设为链表的头,出现冲突就插入链表的最后2.开放地址法:线性的寻找下一个空闲位置3.再哈希法:第二个哈希函数对关键字进行重新计算哈希值
3.什么是二叉搜索树?
左子树都小于节点,右子树都大于节点
4.什么是二叉平衡树?
左右子树高度差不超过1
5.什么是红黑树?
自平衡的二叉搜索树
每个节点都有颜色属性,通过约束颜色维持平衡,可以保证(插入,删除)最坏情况下时间复杂度为log(n)
6.什么是堆?
可最快的找最大最小值
最大堆(父节点>=子节点)和最小堆
7.堆排序思路
1.建成二叉树2.取出堆顶元素放入结尾3.重复,直到堆为空
8.什么是图?
一组节点和一组边形成的数据结构
9.什么是最短路径算法?
Dijkstra(斯克斯特拉)贪心的选择最短
Floyd-Warshall(佛洛依德)动态规划
10.什么是动态规划?
一个问题分割为多个问题
三,数据库技术
1.什么是ACID属性?在数据库中的作用是什么?
原子性,一致性,隔离性,持久性
2.什么是索引?如何优化索引?
索引是数据结构,可以将数据按特定方式进行排序
优化索引:1.确保覆盖所需的所有列2.避免在索引上计算或函数调用3.避免使用简单的数据类型来创建索引4.分区索引能提高查询效率5.删除未使用索引减少开销6.定期重组索引减少碎片
3.如何优化查询性能?
1.避免全表扫描和非必要计算2.确保查询语句使用索引加快速度3.使用内存缓存,减少磁盘io4.频繁查询的表使用缓存技术5.不同类型的查询使用不同存储引擎6.分析数据库性能瓶颈,进行针对性优化
4.什么是数据冗余?如何避免?
存储了相同的数据
1.相关数据存储在一张表中,使用join进行关联查询2.使用视图将多个表聚合为虚拟表3.静态数据使用缓存技术4.规范化设计
5.如何备份和恢复数据库?
1.数据库自带工具mysqldump命令...2.第三方工具3.文件系统级别备份
恢复数据库步骤:1.停止数据库服务2.恢复备份文件到指定目录3.启动数据库服务4.执行修复命令
6.什么是事务?如何保证原子性?
事务是一组操作,失败某一个操作,全部回滚
1.操作封装到事务中2.确保每个操作正常3.发生错误使用rollback命令回滚事务4.针对不同类型错误,使用try/catch进行异常处理
c++华为od面经(csdn)
c++为什么要虚析构?
c++要求程序员手动管理内存,包括对象的构建和销毁
当一个类包含虚函数,其析构函数应该也是虚函数,这样删除基类指针指向派生类对象时,可以正确的调用派生类的析构函数
如果析构函数不是虚函数,那么只调用积累的析构函数,不能释放派生类的组员,形成内存泄漏
为什么不虚构造?
创建对象时,只有当前正在创建类的构造函数会被调用,不存在多态性。
并且虚构造会产生一些问题,比如派生类成员还没初始化,就会调用派生类虚函数,会产生不可预测的问题
说说快排和冒泡
快排是将一个数组找一个基准值分为两个子数组,不断递归下去
冒泡是不断比较交换相邻两个元素
c++三大特性
1.封装继承多态(抽象)2.泛型编程,通过模板实现不同数据的处理3.内存管理:手动管理内存
说说多态
静态多态:函数重载,同名不同参
动态多态:虚函数,将基类声明为虚函数,实现派生类重写基类函数的功能,运行时指向派生类对象的基类指针调用该函数,会根据派生类型自动选择争取的函数
说说虚函数
通过基类声明虚函数,可以派生类重定义函数的功能
动态多态的原理是,运行时确定调用函数的版本,而不是编译时
虚函数的声明和定义必须与其在基类中的原始声明相匹配
说说c++11新特性
自动类型auto
范围for循环
智能指针
lambda表达式
随机数生成器
右值引用
移动语义
静态断言(编译阶段)
强枚举类型(不自动转换,可声明)
右值引用&&
const左值引用可以引用右值
必须立马初始化,且只能右值初始化
右值引用可以对右值进行修改
可以常量右值引用 const int&& a=10;
讲讲智能指针
是对象,行为类似指针,能自动管理内存
分为shared unique weak
讲讲右值引用
右值能引用临时对象和结果
支持移动语义,实现高效移动,而不必进行拷贝
讲一下多线程
一个程序同时执行多个独立的线程,每个县城都有自己的代码流程,通过多线程技术能充分利用多核处理器的能力,提高并发性和相应性
通常存在一个主线程和多个子线程,主线程负责初始化和管理,子线程负责完成任务,提高效率和性能
linux常用命令
rmdir删除空文件夹
lsblk内存
mount挂载
ln链接
pref性能
lsof文件打开数量
网络出现故障用什么排插
ping
ifconfig
traceroute
netstat
ip addr
curl
wget
nslookup
dig
tcpdump
tcp如何建立连接
三次握手
客户端:syn,进入syn-sent状态
服务器:syn、ack,将初始序列号isn放在tcp首部,进入syn-rcvd状态
客户端:ack
连接成功