C++面试问题汇总
阅读原文时间:2023年07月09日阅读:1

作者:勿忘心安~~
链接: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

命名管道和无名管道

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是如何保证有序传输的?

4 数据结构与算法:

  • 堆排序和快速排序 or 快排为什么快呢?

  • 哈希表如何设计?需要利用到磁盘空间。

  • STL中hash_map扩容发生什么?

5 数据库

6 其他知识