C++必须掌握的15道技术面试题
C++必须掌握的15道技术面试题
(1) 请用简单的语言描述一下C++是什么?C与C++的区别是什么?
答:C++是在C语言的基础上开发的一种面向对象的编程语言,应用广泛,支持多种编程范式,面向对象编程,泛型编程和过程化编程,支持封装,继承,多态等重要特性。C语言是一个结构化的语言,面向的是过程,重在考虑如何通过一个过程,对输入进行运算处理得到输出(或实现过程控制),而对于C++,首先考虑的是如何构造一个对象模型,让这个模型更好的与实际问题相对应,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制。
(2) 什么是面向对象(OOP)?
答:面向对象是对现实世界问题的一种抽象的方法,根据需求要素转化为对象进行问题处理的一种思想。
(3) 解释下封装、继承和多态?
一. 封装
答:封装是实现面向对象的第一步,就是将数据和函数等集合在一个个的类中,封装的意义在于保护或者防止代码(数据)被无意中破坏。
二.继承
答:继承主要实现代码复用,节省开发时间,子类可以继承父类的一些东西;
三.多态
答:同一操作作用于不同对象,可以有不同的解释,产生不同的结果,在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
(4) 设计模式了解哪些,简单举个例子?
答:
设计模式是一套被反复利用,经过分类编排的,代码设计经验的总结。
比如单例模式,保证一个类只有一个实例,并提供一个访问它的全局访问点。
适用于:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
比如工厂模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
适用于:当一个类不知道它所必须创建的对象的类的时候;当一个类希望由它的子类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
(5) STL库用过吗?常见的STL容器有哪些?算法用过哪几个?
答:
STL包括两部分内容:容器和算法。(重要的还有融合这二者的迭代器)
容器,即存放数据的地方。比如array等。
在STL中,容器分为两类:序列式容器和关联式容器。
序列式容器,其中的元素不一定有序,但都可以被排序。如:vector、list、deque、stack、queue、heap、priority_queue、slist;
关联式容器,内部结构基本上是一颗平衡二叉树。所谓关联,指每个元素都有一个键值和一个实值,元素按照一定的规则存放。如:RB-tree、set、map、multiset、multimap、hashtable、hash_set、hash_map、hash_multiset、hash_multimap。
下面各选取一个作为说明。
vector:它是一个动态分配存储空间的容器。区别于c++中的array,array分配的空间是静态的,分配之后不能被改变,而vector会自动重分配(扩展)空间。
set:其内部元素会根据元素的键值自动被排序。区别于map,它的键值就是实值,而map可以同时拥有不同的键值和实值。
算法,如排序,复制……以及个容器特定的算法。这点不用过多介绍,主要看下面迭代器的内容。
迭代器是STL的精髓,我们这样描述它:迭代器提供了一种方法,使它能够按照顺序访问某个容器所含的各个元素,但无需暴露该容器的内部结构。它将容器和算法分开,好让这二者独立设计。
(6) 解释一下const并说明其作用?
答:
1.const可以修饰类的成员变量,表示成员常量,不能被修改;
2.const函数只能调用const函数,非const函数可以调用const函数;
3.如果const构成函数重载,const对象只能调用const函数,非const对象优先调用非const函数;
(7) 堆和栈的区别?堆和栈的生命周期?
答:
一. 堆和栈的空间分配区别
栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量 的值等,类似于数据结构中的栈;
堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。
二. 堆栈的缓存方式区别
栈使用的是一级缓存,通常都是被调用时处于存储空间中,调用完毕立即释放;
堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定。所以调用这些对象的速度要相对低一点。
三. 堆栈的数据结构区别
栈(数据结构):一种先进后出的数据结构;
堆(数据结构):堆可以被看成是一棵树,如:堆排序;
(8) 指针和引用的区别?
答:
1.指针是一个变量,只不过这个变量存储的是一个地址,指向内存中的一个存储单元,而引用仅是一个别名;
2.引用使用时无需解引用(*),指针需要解引用;
3.引用只能在定义时被初始化一次,之后不可变,指针可变;
4.引用没有const,指针有const;
5.引用不能为空,指针可以为空;
6.“sizeof引用” 得到的是所指向变量(对象)的大小,而“sizeof 指针”得到的值指针本身的大小;
7.引用和指针的自增(++)运算意义不一样;
8.指针可以有多级,但是引用只能是一级(int**p;合法而int &&a是不合法的);
(9) 什么是内存泄露?面对内存泄露和指针越界,有哪些方法?通常采用哪些方法来避免和减少这类错误?
答:
用动态存储分配函数动态开辟空间,在使用完毕后未释放,结果的哦啊之一直占用内存单元即为内存泄露;使用的时候要记得指针的长度,malloc的时候得确定在哪里free;对指针赋值的时候应该注意被赋值指针需要不需要释放;动态分配内存的指针最好不要再次赋值。
(10) new和malloc的区别?
答:
1、malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2、对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
3、由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4、C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。
(11) TCP和UDP通信的差别?什么是IOCP?
答:
1.TCP面向连接, UDP面向无连接的
2.TCP有保障的,UDP传输无保障的
3.TCP是效率低的,UDP效率高的
4.TCP是基于流的,UDP基于数据报文
5.TCP传输重要数据,UDP传输不重要的数据
IOCP全称I/O Completion Port,中文译为I/O完成端口。
IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。
与使用select()或是其它异步方法不同的是,一个套接字[socket]与一个完成端口关联了起来,然后就可继续进行正常的Winsock操作了。然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口。
(12) 同步IO和异步IO的区别?
答:
A. 同步
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等)。
但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。
最常见的例子就是 SendMessage。
该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。
当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者。
B. 异步
异步的概念和同步相对。
当一个异步过程调用发出后,调用者不会立刻得到结果。
实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。
(13) 解释C++中静态函数和静态变量?
答:
(1)类静态数据成员在编译时创建并初始化:在该类的任何对象建立之前就存在,不属于任何对象,而非静态类成员变量则是属于对象所有的。类静态数据成员只有一个拷贝,为所有此类的对象所共享。
(2)类静态成员函数属于整个类,不属于某个对象,由该类所有对象共享。
1、static 成员变量实现了同类对象间信息共享。
2、static 成员类外存储,求类大小,并不包含在内。
3、static 成员是命名空间属于类的全局变量,存储在 data 区的rw段。
4、static 成员只能类外初始化。
5、可以通过类名访问(无对象生成时亦可),也可以通过对象访问。
1、静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。
2、静态成员函数只能访问静态数据成员。原因:非静态成员函数,在调用时 this指针时被当作参数传进。而静态成员函数属于类,而不属于对象,没有 this 指针。
(14) 说下你对内存的了解?
答:
栈 - 由编译器自动分配释放
堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
另外还有一个专门放常量的地方。- 程序结束释放
程序代码区,存放2进制代码。
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
(15) TCP为什么是三次握手,四次挥手?
【TCP 建立连接全过程解释】
- 客户端发送 SYN 给服务器,说明客户端请求建立连接;
- 服务端收到客户端发的 SYN,并回复 SYN+ACK 给客户端(同意建立连接);
- 客户端收到服务端的 SYN+ACK 后,回复 ACK 给服务端(表示客户端收到了服务端发的同意报文);
- 服务端收到客户端的 ACK,连接已建立,可以数据传输。
TCP 为什么要进行三次握手?
【答案一】因为信道不可靠,而 TCP 想在不可靠信道上建立可靠地传输,那么三次通信是理论上的最小值。(而 UDP 则不需建立可靠传输,因此 UDP 不需要三次握手。)
Google Groups . TCP 建立连接为什么是三次握手?{技术}{网络通信}
【答案二】因为双方都需要确认对方收到了自己发送的序列号,确认过程最少要进行三次通信。
知乎 . TCP 为什么是三次握手,而不是两次或四次?
【答案三】为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
【TCP 释放连接全过程解释】
- 客户端发送 FIN 给服务器,说明客户端不必发送数据给服务器了(请求释放从客户端到服务器的连接);
- 服务器接收到客户端发的 FIN,并回复 ACK 给客户端(同意释放从客户端到服务器的连接);
- 客户端收到服务端回复的 ACK,此时从客户端到服务器的连接已释放(但服务端到客户端的连接还未释放,并且客户端还可以接收数据);
- 服务端继续发送之前没发完的数据给客户端;
- 服务端发送 FIN+ACK 给客户端,说明服务端发送完了数据(请求释放从服务端到客户端的连接,就算没收到客户端的回复,过段时间也会自动释放);
- 客户端收到服务端的 FIN+ACK,并回复 ACK 给客户端(同意释放从服务端到客户端的连接);
- 服务端收到客户端的 ACK 后,释放从服务端到客户端的连接。
TCP 为什么要进行四次挥手?
【问题一】TCP 为什么要进行四次挥手? / 为什么 TCP 建立连接需要三次,而释放连接则需要四次?
【答案一】因为 TCP 是全双工模式,客户端请求关闭连接后,客户端向服务端的连接关闭(一二次挥手),服务端继续传输之前没传完的数据给客户端(数据传输),服务端向客户端的连接关闭(三四次挥手)。所以 TCP 释放连接时服务器的 ACK 和 FIN 是分开发送的(中间隔着数据传输),而 TCP 建立连接时服务器的 ACK 和 SYN 是一起发送的(第二次握手),所以 TCP 建立连接需要三次,而释放连接则需要四次。
【问题二】为什么 TCP 连接时可以 ACK 和 SYN 一起发送,而释放时则 ACK 和 FIN 分开发送呢?(ACK 和 FIN 分开是指第二次和第三次挥手)
【答案二】因为客户端请求释放时,服务器可能还有数据需要传输给客户端,因此服务端要先响应客户端 FIN 请求(服务端发送 ACK),然后数据传输,传输完成后,服务端再提出 FIN 请求(服务端发送 FIN);而连接时则没有中间的数据传输,因此连接时可以 ACK 和 SYN 一起发送。
【问题三】为什么客户端释放最后需要 TIME-WAIT 等待 2MSL 呢?
【答案三】
为了保证客户端发送的最后一个 ACK 报文能够到达服务端。若未成功到达,则服务端超时重传 FIN+ACK 报文段,客户端再重传 ACK,并重新计时。
防止已失效的连接请求报文段出现在本连接中。TIME-WAIT 持续 2MSL 可使本连接持续的时间内所产生的所有报文段都从网络中消失,这样可使下次连接中不会出现旧的连接报文段。
C++必须掌握的15道技术面试题相关推荐
- mysql试题百度云_BATJ大厂600多道技术面试题及答案解析
GitHub 上有位程序员总结了 2019 年阿里.腾讯.华为.百度.美团.今日头条.滴滴.京东等大厂 600 多道技术面试题以及答案,涉及 MySQL.Redis.MongDB.Zookeeper. ...
- es6的15道面试题
1.说出至少5个ES6的新特性,并简述它们的作用.(简答题) 答: 1. let关键字,用于声明只在块级作用域起作用的变量. 2. const关键字,用于声明一个常量. 3. 结构赋值,一种新的变量赋 ...
- python 实数如何取整_从面试官角度提问:15道硬核Python面试题,论面霸是如何炼成的...
见过面试题也不少了,总之了一句话:面试前备好功课,面试中临危不乱,面试后谦虚有礼!这只是我本人总结的一些面试三要素,需要的可以参考参考,话不多了,今天为大家找了比较硬核的15道面试题,希望能够对各位有 ...
- python画菊花_网传“菊花厂月薪13K”15道硬核Python面试题,值得一看!
见过面试题也不少了,总之了一句话:面试前备好功课,面试中临危不乱,面试后谦虚有礼!这只是我本人总结的一些面试三要素,需要的可以参考参考,话不多了,今天为大家找了网传菊花厂比较硬核的15道面试题,希望能 ...
- 阿里开发者招聘节 | 2019阿里巴巴技术面试题分享:20位专家28道题
为什么80%的码农都做不了架构师?>>> 为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的 ...
- 面试稳了!BATJ 等大厂 400+ 道面试题全汇总!
整理 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 2019 年已过半,大家在年初设定的目标进行得怎样了?预计涨的薪.跳的槽都完成了吗? 如果没的话,不妨看看这篇文章.GitHub 上有位 ...
- 松哥整理了 15 道 Spring Boot 高频面试题,看完当面霸
什么是面霸?就是在面试中,神挡杀神佛挡杀佛,见招拆招,面到面试官自惭形秽自叹不如!松哥希望本文能成为你面霸路上的垫脚石! 做 Java 开发,没有人敢小觑 Spring Boot 的重要性,现在出去面 ...
- Google 15道古怪面试题(有参考答案)
http://student.csdn.net/mcd/topic/833628/944375 Google的面试题在刁钻古怪方面相当出名,甚至已经有些被神化的味道.这个话题已经探讨过很多次,这里贴出 ...
- 最新Google 15道古怪面试题
Google的面试题在刁钻古怪方面相当出名,甚至已经有些被神化的味道.这个话题已经探讨过很多次,而科技博客BusinessInsider这两天先是贴出15道Google面试题并一一给出了答案,其中不少 ...
- 某学员成功入职大厂软件测试主管后总结的8个面试建议和15道经典面试题
找工作或找到合适的工作,一直都是在职场人中经常被提及的话题,特别是在互联网这个人才流动性比较大的行业.而每次提到找工作,也必然少不了对面试的谈论. 因为软件测试是偏向于技术类的岗位,所以除了需要在面试 ...
最新文章
- 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)
- 网络编程(part12)--HTTP传输
- Vue项目中Table设置 render 函数
- 使用echarts时,鼠标首次移入屏幕会闪动,屏幕会出现滚动条
- 《DeepLearning.ai 深度学习笔记》发布,黄海广博士整理
- Android SQLite数据库升级的问题
- 计算机睡眠断网,win7睡眠不断网设置方法汇总
- 关于AOP(面向方面的编程)
- 树莓派raspberrypi系统安装docker以及编译nginx和php镜像
- html怎么写java代码_html中怎么写java代码
- 超全汇总,常见的芯片封装大全-道合顺大数据infinigo
- 联想计算机wifi卸载,怎么卸载联想笔记本电源管理软件
- Excel如何将二维表转成数据列
- FinClip手把手教学:如何从零开始编写一个app
- 迪斯尼电影经典台词精选
- 【JS】使用jQuery制作图片手风琴效果
- 【ubuntu】笔记本合上盖子不休眠
- (30)C#使用NUNIT单元测试
- 微型计算机只能识别的语言,计算机唯一能直接识别和处理的语言是( )。
- 【codeforces 791A】Bear and Big Brother
热门文章
- iOS12.4完整越狱来了,附手机端一键越狱教程!
- android apk安装工具,Win10 Mobile安装安卓APK应用快捷安装工具下载
- 2节串联锂电池充电管理芯片IC,5V,12V升降压解决方案
- Lua里面new一个对象详细步骤
- 彩色图像灰度化MFC
- 【新闻推荐系统】(task3)Scrapy基础及新闻爬取实战
- 分布式机器学习\分布式KMeans
- 分布式机器学习联邦学习论文阅读笔记(持续更新)
- Unity 接入旷视Face进行人脸融合
- python3 scrapy中文文档_如何用python3创建scrapy项目