LinuxLinux学习之路我用 Linux

知识总结:C++工程师106道面试题总结(含答案详解)

2019-08-27  本文已影响0人  7ee72f98ad17

秋招就要开始了,很多小伙伴们应该都在紧张的复习,这里提供一下自己复习的东西吧,我也就把这个东西给搞了一遍,然后面试基本没啥问题了,如果问的很深的话,那就只能只求多福了兄弟!其中可能有一些错误或者由于编译环境有差异请大家自动忽略这些错误

信号的生命周期?

信号产生-》信号在进程中注册-》信号在进程中的注销-》执行信号处理函数 

信号的产生方式?

(1)当用户按某些终端键时产生信号(2)硬件异常产生信号【内存非法访问】(3)软件异常产生信号【某一个条件达到时】(4)调用kill函数产生信号【接受和发送的所有者必须相同,或者发送的进程所有者必须为超级用户】(5)运行kill命令产生信号 

信号处理方式?

(1)执行默认处理方式(2)忽略处理(3)执行用户自定义的函数 

如何消除隐式转换?

使用explicit关键字进行修饰 

重载,重写和隐藏的区别?

重载:即函数重载 

重写【覆盖】:即用于虚函数 

隐藏:只要派生类的函数名与基类相同就会隐藏 

volatile表示什么?有什么作用?

易变的,不会被编译器进行优化,让程序取数据直接去内存中的。 

Static_cast<>,dynamic_cast<>,const_cast<>,reinterpret_cast<>的各自作用和使用环境?

Static_cast:能完成大部分转换功能,但是并不确保安全 

Const_cast:无法从根本上转变类型,如果是const,它就依旧是const,只是如果原对象不是const,可以通过此转换来处理,针对指针和引用而言。 

Dynamic_cast:针对基类和派生类指针和引用转换,基类和派生类之间必须要继承关系,是安全的 

Reinterpret_cast:允许将任何指针类型转为其他指针类型,是安全的 

Malloc和new的区别?

New:内存分配错误时,抛出bad_alloc异常,可以定义set_new_handler函数来在产生异常时进行处理;本身是一个运算符;分配内存的地方为自由存储区【为一个抽象概念】;对于对象而言,会先申请内存空间然后调用构造函数;无需指定大小 

Malloc:内存分配错误时,返回NULL;本身是一个库函数;分配内存的地方为堆;只申请内存空间;需要指定申请多大的内存; 

free和delete的区别?

Delete:本身是一个运算符 

Free:本身是一个库函数 

free一个数组时如何知道要释放多大的内存呢?

   一般在数组前面几个字节中存在某一个结构体来保存当前申请的数组大小。 

__stdcall和__cdecl的区别?

__stdcall: 从右往左压栈,堆栈参数数据由函数本身清除,一般是通过汇编指令ret x,x表示弹出x个字节,参数必须是确定,必须为函数本身知晓,所以此关键字不能用于有可变参数应用的函数声明。 

__cdecl: 从右往左压栈,由调用者来对堆栈数据进行清除,步骤:调用方调用函数-》函数执行-》函数结果返回-》调用方清除堆栈参数,主要针对可变参数 

linux内部提供了那些调试宏?

   __FILE__:表示在哪个文件 

   __LINE__:表示在当前多少行 

   __FUNCTION__:表示在执行在哪个函数 

手写线程安全的单例模式?

引用和指针的区别?

出现异常时,try和catch做了什么?

C++如何处理多个异常的?

常对象的成员变量一定不可以修改吗?为什么?

虚函数的调用过程?

汇编层面:

单继承,多继承,菱形继承,虚继承时,对象内存中的差异区别?如果存在虚函数呢?

实现一个vector?是1.5还是2倍,各有什么优缺点?

map底层用了什么?

如果用map删除了一个元素,迭代器还能用吗?为什么?怎样做可以接着用?

红黑树的特征是什么?

红黑树如何插入和删除的?

红黑树和B+,B-的区别?

线程同步几种方式?

手写strcpy,memcpy,memmove函数?

Do{}while(0)的用法有哪些?

手写快排?时间复杂度?空间复杂度?能进行优化吗?还有吗?能进行尾递归优化吗?

线程池的作用是什么?

Pthread_cond_signal和pthread_cond_broadcast的区别

线程有几种状态?进程又有几种状态?

TCP三次握手和四次挥手及各自的状态?

TCP如果两次握手会出什么问题?那三次握手又会造成什么问题?有什么好的解决方法没?

TCP四次挥手为什么要有TIME_WAIT状态?为什么?

死锁的原因?条件?如何预防?又如何避免?如何解除?

排序稳定的算法,你知道那些?

解决hash冲突的方法?

C++分为内存分为哪几部分?

如果new申请内存失败了,如何去解决?如果让你实现一个new,你会怎么实现?

如何得到一个结构体内成员的偏移量?

进程与线程的区别?

逐层打印二叉树?

构造函数能不能虚函数?为什么?那拷贝构造函数能不能为虚函数?为什么?

析构函数能不能虚函数?为什么?

模板和实现可不可以不写在一个文件里面?为什么?

什么是RAII资源管理?

为什么要字节对齐?

在成员函数中调用delete this会出现什么问题?对象还可以使用吗?

如果在构造函数中调用memset(this, 0, sizeof(*this))来初始化内存空间,有什么问题吗?

对一个数组而言,delete a和delete[] a有什么区别?为什么?

Dynamic_cast是如何实现运行时类型转换的?

C语言调用C++语法函数怎么做?那C++调用C语法的函数怎么做?

Extern “C”是什么意思?他有什么作用?

进程间的通信方式有哪些?线程间的通信方式呢?

IO模型主要有哪些?

阻塞和非阻塞?同步与异步的区别?

Select,poll和epoll的区别?为什么?

Struct{char a[0];}的作用?有什么好处?

如何判断两个浮点数相等?

浮点数为什么会有误差?

TCP的nagle算法和延迟ack,还有CORK呢?他们有什么好处?一起用会有什么效果?你觉得可以有什么改进?

栈上分配内存和堆上分配内存有什么区别?

变量的存储方式有哪些?

线程私有和共享那些资源?进程私有和共享那些资源?

什么是守护进程?如何查看守护进程?什么是僵尸进程?如何查看僵尸进程?

进程同步机制?

什么是信号?

kill函数的每一个参数的作用?

什么是协程?

虚拟内存实现有哪几种方式?有什么意义?

什么是类型安全?能举例吗?

确保线程安全的几种方式?

OSI七层模型?

TCP/IP五层模型?

DHCP协议是什么?使用什么端口?他的优劣?

网络序是大端还是小端?为什么要这样?

ping命令使用的是什么协议?

路由表一般包含什么?

停止等待协议的缺点?为什么?

拥塞控制的方式?具体怎么做的?快重传的时机是什么?

DNS协议如何实现将域名解析为IP地址的?

创建进程的步骤?

进程切换发生的原因?处理进程切换的步骤?

虚函数表是在什么时候确定的?那虚表指针呢?

如何检查内存泄露?如果不通过printf,debug等调试方式和编译器报错提示呢?

Int(*f(int,void(*)()))(int,int)是什么意思?

STL空间配置器如何处理内存的?能说一下它的大概实现方案吗?为什么是8bytes的倍数?

HTTP 403表示什么?

静态函数能定义为虚函数吗?为什么?

静态函数能定义为常函数吗?为什么?

知道什么是幂等性吗?举个例子?

当接受方的接受窗口为0时还能接受数据吗?为什么?还能接受什么数据?那怎么处理这些数据呢?

请求页面置换策略有哪些方式?他们的区别是什么?各自有什么算法解决?

系统调用与函数调用的区别?

对于默认处理的结构体,能用memcmp来进行比较吗?为什么?如果不能,该如何比较?

C++中有哪些机制可以取代宏?

手写一个有可变参数的函数?

可靠信号与不可靠信号的区别?

this指针调用成员变量时,堆栈会发生什么变化?

实现一个shared_ptr类和auto_ptr类?

下面这两个函数在执行过程中有什么区别?

C++中可以继承string类吗?为什么?

Char * const *(*next)()是什么?

访问一个网页的过程,计算机发生了什么?

如何判断const所修饰的对象?

c/c++ 面试题库 v1.0

1. 基础部分

1.1. 语言

一、 C 和 C++的特点与区别?

二、 阐述 C++的多态

三、 阐释 c++虚函数的实现

四、 C 和 C++内存分配问题

2. 高级部分

2.1. 网络

五、 画出三次握手和四次挥手流程图

六、 请阐释 https 建立连接过程

七、 画出 OSI 和 TCP/IP 协议栈的对应关系

八、 请阐释 ARQ 协议的原理和过程

九、 请阐释滑动窗口协议原理和过程

操作系统.

十、 进程通信方式有哪些?哪种效率最高?

十一、 线程间的通信方式

十二、 请分别阐释进程和线程的概念,并分析异同?

数据库

十三、 MySQL 中 myisam 与 innodb 的区别

十四、 innodb 引擎的 4 大特性

十五、 MyISAM 和 InnoDB selectcount(*)哪个更快,为什么

十六、 Redis 支持的数据类型?

十七、 什么是 Redis 持久化?Redis 有哪几种持久化方式?优缺点是什么?

十八、 redis 通讯协议(RESP ),能解释下什么是 RESP?有什么特点?....

十九、 Redis 有哪些架构模式?讲讲各自的特点

数据结构

二十、 线性表

二十一、 二叉树 .

二十二、 红黑树

二十三、 平衡树

二十四、 Radix 树

二十五、 八叉树

二十六、 梅克尔树

算法

二十七、 排序算法

选择/冒泡/快速/堆排等

二十八、 一致性哈希算法

二十九、 paxos 算法

三十、 raft 算法

答案部分

1. 基础部分

1.1.语言

一、 C 和 C++的特点与区别?

参考答案:

答:(1)C 语言特点:

1) 作为一种面向过程的结构化语言,易于调试和维护;

2) 表现能力和处理能力极强,可以直接访问内存的物理地址;

3) C 语言实现了对硬件的编程操作,也适合于应用软件的开发;

4) C 语言还具有效率高,可移植性强等特点。

(2)C++语言特点:

1) 在 C 语言的基础上进行扩充和完善,使 C++兼容了 C 语言的面向过程特点,又成为了

一种面向对象的程序设计语言;

2) 可以使用抽象数据类型进行基于对象的编程;

3) 可以使用多继承、多态进行面向对象的编程;

4) 可以担负起以模版为特征的泛型化编程。

二、 阐述 C++的多态

参考答案:

编译时多态:主要指泛型编程

运行时多态:

C++的多态性用一句话概括:在基类的函数前加上 virtual 关键字,在派生类中重写该函数,

运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生

类的函数;如果对象类型是基类,就调用基类的函数。

1) 用 virtual 关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数;

2) 存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的

虚指针。虚表是和类对应的,虚表指针是和对象对应的;

3) 多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。;

4) 多态用虚函数来实现,结合动态绑定.;

5) 纯虚函数是虚函数再加上 = 0;

6) 抽象类是指包括至少一个纯虚函数的类;

纯虚函数:virtual void fun()=0;即抽象类,必须在子类实现这个函数,即先有名称,没

有内容,在派生类实现内容。

三、 阐释 c++虚函数的实现

参考答案:

简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与

之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。

例:

其中:

B 的虚函数表中存放着 B::foo 和 B::bar 两个函数指针。

D 的虚函数表中存放的既有继承自 B 的虚函数 B::foo,又有重写(override)了基类虚函

数 B::bar 的 D::bar,还有新增的虚函数 D::quz。

虚函数表构造过程:

从编译器的角度来说,B 的虚函数表很好构造,D 的虚函数表构造过程相对复杂。下面给出

了构造 D 的虚函数表的一种方式(仅供参考):

虚函数调用过程

以下面的程序为例:

由于答案部分太多了,就不一一表现出来了,大家如果想要获取此份面试题总结答案可以加群:964383639

上一篇下一篇

猜你喜欢

热点阅读