C++面试问题汇总
作者:勿忘心安~~
链接:https://www.nowcoder.com/discuss/197611
来源:牛客网
1 C++基础:
(1)多态是怎么样的?写个样例?
https://www.cnblogs.com/yichengming/p/11427811.html
(2)c和c++的区别
https://www.cnblogs.com/yichengming/p/11427890.html
(3)什么是虚函数?什么是纯虚函数?
虚函数是允许被其子类重新定义的成员函数
虚函数的声明:virtual returntype func(parameter);引入虚函数的目的是为了动态绑定;
纯虚函数声明:virtual returntype func(parameter)=0;引入纯虚函数是为了派生接口。(使派生类仅仅只是继承函数的接口)
(4)基类为什么需要虚析构函数?
防止内存泄漏。假如没有虚析构函数,释放一个由基类指针指向的派生类对象时,不会去触发动态绑定,则只会调用基类的析构函数,不会调用派生类的析构函数。派生类中申请的空间则得不到释放导致内存泄漏。
(5)当i是一个整数的时候i++和++i哪个更快?它们的区别是什么?
考虑内建数据类型时,它们的效率差别不大(去除编译器优化的影响)。所以在这种情况下我们大可不必关心。
现在让我们再考虑自定义数据类型(主要是指类)的情况。此时我们不需要再做很多汇编代码的分析了,因为前缀式(++i)可以返回对象的引用,而后缀式(i++)必须产生一个临时对象保存更改前对象的值并返回(实现过自定义类型++运算符定义的就知道),所以导致在大对象的时候产生了较大的复制开销,引起效率降低,因此处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能的使用前缀式地增/递减,因为他天生体质较佳。
此外,++i返回的是对象的引用,是一个可以修改的左值。
(6)当i是一个整数的时候i++和++i哪个更快?它们的区别是什么?
reserve()用于让容器预留空间,避免再次分配内存;capacity()返回在重新进行分配以前所能容纳的元素数量。
(7)如何初始化const和static数据成员
通常在类外申明static,但是static const的整型(bool,char,int,long)可以在类中声明且初始化,static const的其他类型必须在类外初始化(包括整型数组)。
(8)static和const分别怎么用,类里面static和const可以同时修饰成员函数吗?
https://www.cnblogs.com/yichengming/p/11428100.html
(9)指针和引用的区别
本质上的区别是,指针是一个新的变量,只是这个变量存储的是另一个变量的地址,我们通过访问这个地址来修改变量。
而引用只是一个别名,还是变量本身。对引用进行的任何操作就是对变量本身进行操作,因此以达到修改变量的目的。
注:
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。
而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。
(2)可以有const指针,但是没有const引用(const引用可读不可改,与绑定对象是否为const无关)
注:引用可以指向常量,也可以指向变量。例如int &a=b,使引用a指向变量b。而为了让引用指向常量,必须使用常量引用,如const int &a=1; 它代表的是引用a指向一个const int型,这个int型的值不能被改变,而不是引用a的指向不能被改变,因为引用的指向本来就是不可变的,无需加const声明。即指针存在常量指针int const *p和指针常量int *const p,而引用只存在常量引用int const &a,不存在引用常量int& const a。
(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
(7)指针和引用的自增(++)运算意义不一样;
(8)指针使用时需要解引用(*),引用则不需要;
(9)什么是
- emplace / empalce_front / emplace_back
- 面向对象的?面向对象的特性?有什么优点,比面向过程的语言好在哪?
- · 模板特化
- · 定位内存泄露
- C语言是怎么进行函数调用的?
- C语言参数压栈顺序?
- C语言如何处理返回值?
2 操作系统
(1)进程间七大通信方式
管道(Pipe)、命名管道(Named pipe)、信号(Signal)、消息队列(Message queue)、共享内存(Shared memory)、套接字(Socket)、信号量(Semaphore)
https://blog.csdn.net/zhaohong_bo/article/details/89552188
命名管道和无名管道
- 堆栈溢出
- 进程和线程(https://www.cnblogs.com/qianqiannian/p/7010909.html)
- 守护进程、僵尸进程、孤儿进程,守护进程的作用是什么?
- · 协程
- 一个文件被删除了,没有被释放是什么原因呢?
- 弱类型、强类型、动态类型是什么(https://blog.csdn.net/endlessseaofcrow/article/details/80350347)
- 自旋锁(https://baike.baidu.com/item/%E8%87%AA%E6%97%8B%E9%94%81/9137985?fr=aladdin)
- 进程栈和线程栈的区别(https://blog.csdn.net/yangkuanqaz85988/article/details/52403726)
- · OPEN的过程
- READ的过程
- WRITE的过程 (https://blog.csdn.net/csu_max/article/details/38623053)
- 操作系统是如何调度进程呢(https://blog.csdn.net/qq_35642036/article/details/82809812)
- 消息队列
- · malloc函数具体实现原理
- 死锁的原因?条件?如何预防?又如何避免?如何解除?
- 线程是如何绑定到具体的cpu
- 什么是绑核?实现方式?
- 进程的调度算法
3 TCP网络
- 概率题
假设一段公路上,1小时内有汽车经过的概率为96%,那么,30分钟内有汽车经过的概率为?
- 字节序与网络字节序
- 超时重传、快速重传
- 客户端服务器通信死锁如何处理?
1) HTTP协议与TCP/IP协议的关系
2) 如何理解HTTP协议是无状态的
3)什么是长连接、短连接?
4)TCP协议的长连接和短连接优点和缺点
- · 什么是MD5?
- · 阻塞式IO使用场景
- · 什么是TCP粘包
- · 拒绝服务攻击DOS
- XSS,SQL
- · HTTPS建立连接的过程
- 常用的HTTP请求头与响应头
HTTP请求头:
HTTP响应头:
TCP是如何保证有序传输的?
- · POST可以获取数据吗?就是实现GET方法?
4 数据结构与算法:
- 堆排序和快速排序 or 快排为什么快呢?
- 哈希表如何设计?需要利用到磁盘空间。
- STL中hash_map扩容发生什么?
5 数据库
6 其他知识
- UTF8和GD2312的区别
- C++多线程对10个文件进行排序