华为、美团、微软、字节、阿里研发校招编程测试题及答案参考
C++
1、面向对象的三大特性:封装、继承、多态
2、类的访问权限:private、protected、public
3、类的构造函数、析构函数、赋值函数、拷贝函数
4、移动构造函数与拷贝构造函数对比
5、深拷贝与浅拷贝的区别
6、空类有哪些函数?空类的大小?
7、内存分区:全局区、堆区、栈区、常量区、代码区
8、C++与C的区别
9、struct与class的区别
10、struct、union 内存对齐
11、new/delete与malloc/free的区别
12、内存泄露的情况分析
13、sizeof与strlen对比
14、指针与引用的区别
- C语言的指针和引用和c++的有什么区别?
15、野指针产生与避免
16、多态:动态多态、静态多态
17、虚函数实现动态多态的原理、虚函数与纯虚函数的区别
18、继承时,父类的析构函数是否为虚函数?构造函数能不能为虚函数?为什么?
19、静态多态:重写、重载、模板
20、static关键字:修饰局部变量、全局变量、类中成员变量、类中成员函数
- C 语言的关键字static和 C++ 的关键字static有什么区别
21、const关键字:修饰变量、指针、类对象、类中成员函数
22、extern关键字:修饰全局变量
23、volatile关键字:避免编译器指令优化
- 一个参数可以既是const又是volatile吗
24、四种类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
25、C++11 部分新特性,比如右值引用、完美转发等
-
什么是右值引用,跟左值又有什么区别?
-
完美转发
26、std::move函数
27、四种智能指针及底层实现:auto_ptr、unique_ptr、shared_ptr、weak_ptr
28、shared_ptr中的循环引用怎么解决?(weak_ptr)
- shared_ptr 和 unique_ptr
29、vector与list比较
- vector的底层原理
- list的底层原理
- vector中的reserve和resize的区别
- vector中的size和capacity的区别
- vector中erase方法与algorithn中的remove方法区别
- 正确释放vector的内存(clear(), swap(), shrink_to_fit())
- vector迭代器失效的情况
- 什么情况下用vector,什么情况下用list,什么情况下用 deque
30、priority_queue的底层原理
31、STL部分容器的实现原理,如 vector、deque、map、hashmap、set、list
- map与unordered_map对比
- set\map机制
- map 、set、multiset、multimap的底层原理
- map 、set、multiset、multimap的特点
- 为何map和set的插入删除效率比其他序列容器高
- 为何map和set每次Insert之后,以前保存的iterator不会失效?
- 当数据元素增多时(从 10000 到 20000),map的set的查找速度会怎样变化?
- 为何map和set的插入删除效率比其他序列容器高,而且每次insert 之后,以前保存的iter
- 为何map和set不能像vector一样有个reserve函数来预分配数据?
- set的底层实现实现为什么不用哈希表而使用红黑树?
- hash_map与map的区别?什么时候用hash_map,什么时候用map?
32、set与unordered_set对比
33、STL容器空间配置器
- 📦 STL,
- STL线程不安全的情况
34、变量的声明和定义有什么区别
35、简述strcpy、sprintf与memcpy的区别
36、请解析(*(void (*)( ) )0)( )的含义
37、设置地址为0x67a9的整型变量的值为0xaa66
38、简述指针常量与常量指针的区别
39、请你来说一下 C++ 中struct和class的区别
40、简述#ifdef、#else、#endif和#ifndef的作用
41、typedef和define有什么区别
- 写一个 “标准”宏MIN
42、写出int 、bool、 float、指针变量与 “零值”比较的if语句
43、结构体可以直接赋值吗
44、谈谈你对拷贝构造函数和赋值运算符的认识
45、sizeof和strlen的区别
46、关键字 override
- 简述类成员函数的重写、重载和隐藏的区别
47、C++ 自己实现一个String类
48、用两个栈实现一个队列的功能
49、高级数据结构
- 红黑树
- B B+树
- 图
50、编译链接机制、内存布局(memory layout)、对象模型
💻 操作系统
1、进程与线程区别
2、线程同步的方式:互斥锁、自旋锁、读写锁、条件变量
3、互斥锁与自旋锁的底层区别
4、孤儿进程与僵尸进程
5、死锁及避免
6、多线程与多进程比较
7、进程间通信:PIPE、FIFO、消息队列、信号量、共享内存、socket
8、管道与消息队列对比
9、fork进程的底层:读时共享,写时复制
10、线程上下文切换的流程
11、进程上下文切换的流程
12、进程的调度算法
13、阻塞IO与非阻塞IO
14、同步与异步的概念
15、静态链接与动态链接的过程
16、虚拟内存概念(非常重要)
17、MMU地址翻译的具体流程
18、缺页处理过程
19、缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法
网络编程
Linux 下网络编程核心的包括系统编程和网络 IO 两个部分:
1、进程间通信方式:信号量、管道、共享内存、socket 等
2、多线程编程:互斥锁、条件变量、读写锁、线程池等
3、五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动 区别/联系
4、线程池
5、高性能 IO 两种模式:Reactor 和 Proactor( 但是 Linux 下由于缺少异步 IO 支持,基本没有 Proactor)
6、IO多路复用:select、poll、epoll的区别(非常重要,几乎必问,回答得越底层越好,要会使用)
7、手撕一个最简单的server端服务器(socket、bind、listen、accept这四个API一定要非常熟练)
8、边沿触发与水平触发的区别