20道必须掌握的C++⾯试题
20道必须掌握的C++⾯试题
在⾯试C++⽅⾯的⼯作时,经常会遇到各种⾯试题,这对应聘⼈员的知识掌握能⼒要求较⾼。本⽂将为⼤家带来的就是20道必须掌握的
C++⾯试题,不要错过哦!
问1:请⽤简单的语⾔告诉我C++ 是什么?
答:C++是在C语⾔的基础上开发的⼀种⾯向对象编程语⾔,应⽤⼴泛。C++⽀持多种编程范式--⾯向对象编程、泛型编程和过程化编程。其编程领域众⼴,常⽤于系统开发,引擎开发等应⽤领域,是最受⼴⼤程序员受⽤的最强⼤编程语⾔之⼀,⽀持类:类、封装、重载等特性!
问2:C和C++的区别?
答:c++在c的基础上增添类,C是⼀个结构化语⾔,它的重点在于算法和数据结构。C程序的设计⾸要考虑的是如何通过⼀个过程,对输⼊(或环境条件)进⾏运算处理得到输出(或实现过程(事务)控制),⽽对于C++,⾸要考虑的是如何构造⼀个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
问3:什么是⾯向对象(OOP)?
答:⾯向对象是⼀种对现实世界理解和抽象的⽅法、思想,通过将需求要素转化为对象进⾏问题处理的⼀种思想。
问4:什么是多态?
答:多态是指相同的操作或函数、过程可作⽤于多种类型的对象上并获得不同的结果。不同的对象,收到同⼀消息可以产⽣不同的结果,这种现象称为多态。
问5:设计模式懂嘛,简单举个例⼦?
答:
设计模式(Design pattern)是⼀套被反复使⽤、多数⼈知晓的、经过分类编⽬的、代码设计经验的总结。
⽐如单例模式,保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点。
适⽤于:当类只能有⼀个实例⽽且客户可以从⼀个众所周知的访问点访问它时;当这个唯⼀实例应该是通过⼦类化可扩展的,并且客户应该⽆需更改代码就能使⽤⼀个扩展的实例时。
⽐如⼯⼚模式,定义⼀个⽤于创建对象的接⼝,让⼦类决定实例化哪⼀个类。Factory Method 使⼀个类的实例化延迟到其⼦类。
适⽤于:当⼀个类不知道它所必须创建的对象的类的时候;当⼀个类希望由它的⼦类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助⼦类中的某⼀个,并且你希望将哪⼀个帮助⼦类是代理者这⼀信息局部化的时候。
问6: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的精髓,我们这样描述它:迭代器提供了⼀种⽅法,使它能够按照顺序访问某个容器所含的各个元素,但⽆需暴露该容器的内部结构。它将容器和算法分开,好让这⼆者独⽴设计。
问7:数据结构会吗?项⽬开发过程中主要⽤到那些?
答:数据结构中主要会⽤到数组,链表,树(较少),也会⽤到栈和队列的思想。
问8:const知道吗?解释其作⽤。
答:
3.如果 const 构成函数重载,const 对象只能调⽤ const 函数,⾮ const 对象优先调⽤⾮ const 函数。
5.类体外定义的 const 成员函数,在定义和声明处都需要 const 修饰符。
问9:类的static变量在什么时候初始化?函数的static变量在什么时候初始化?
答:类的静态成员变量在类实例化之前就已经存在了,并且分配了内存。函数的static变量在执⾏此函数时进⾏初始化。
问10:堆和栈的区别?堆和栈的⽣命周期?
答:
⼀、堆栈空间分配区别:
1、栈(操作系统):由操作系统⾃动分配释放,存放函数的参数值,局部变量的值等。其操作⽅式类似于数据结构中的栈;
2、堆(操作系统):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配⽅式倒是类似于链表。
⼆、堆栈缓存⽅式区别:
1、栈使⽤的是⼀级缓存,他们通常都是被调⽤时处于存储空间中,调⽤完毕⽴即释放;
2、堆是存放在⼆级缓存中,⽣命周期由虚拟机的垃圾回收算法来决定(并不是⼀旦成为孤⼉对象就能被回收)。所以调⽤这些对象的速度要相对来得低⼀些。
三、堆栈数据结构区别:
堆(数据结构):堆可以被看成是⼀棵树,如:堆排序;
栈(数据结构):⼀种先进后出的数据结构。
问11:C和C++的区别?
答:
C++在C的基础上增添类
C是⼀个结构化语⾔,它的重点在于算法和数据结构。
C程序的设计⾸要考虑的是如何通过⼀个过程,对输⼊(或环境条件)进⾏运算处理得到输出(或实现过程(事务)控制),⽽对于C++,⾸要考虑的是如何构造⼀个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
问12:解释下封装、继承和多态?
答:
⼀、封装:
封装是实现⾯向对象程序设计的第⼀步,封装就是将数据或函数等集合在⼀个个的单元中(我们称之为类)。
封装的意义在于保护或者防⽌代码(数据)被我们⽆意中破坏。
⼆、继承:
继承主要实现重⽤代码,节省开发时间。
⼦类可以继承⽗类的⼀些东西。
三、多态
多态:同⼀操作作⽤于不同的对象,可以有不同的解释,产⽣不同的执⾏结果。在运⾏时,可以通过指向基类的指针,来调⽤实现派⽣类中的⽅法。
问13:指针和引⽤的区别?
答:
1. 指针是⼀个变量,只不过这个变量存储的是⼀个地址,指向内存的⼀个存储单元;⽽引⽤仅是个别名;
2. 引⽤使⽤时⽆需解引⽤(*),指针需要解引⽤;
3. 引⽤只能在定义时被初始化⼀次,之后不可变;指针可变;
4. 引⽤没有 const,指针有 const;
5. 引⽤不能为空,指针可以为空;
6. “sizeof 引⽤”得到的是所指向的变量(对象)的⼤⼩,⽽“sizeof 指针”得到的是指针本⾝的⼤⼩;
7. 指针和引⽤的⾃增(++)运算意义不⼀样;
8. 指针可以有多级,但是引⽤只能是⼀级(int **p;合法⽽ int &&a是不合法的)
9.从内存分配上看:程序为指针变量分配内存区域,⽽引⽤不需要分配内存区域。
问14:什么是内存泄漏?⾯对内存泄漏和指针越界,你有哪些⽅法?你通常采⽤哪些⽅法来避免和减少这类错误?
答:⽤动态存储分配函数动态开辟的空间,在使⽤完毕后未释放,结果导致⼀直占据该内存单元即为内存泄露。
使⽤的时候要记得指针的长度。
malloc的时候得确定在那⾥free.
对指针赋值的时候应该注意被赋值指针需要不需要释放.
动态分配内存的指针最好不要再次赋值.
问15:常⽤的排序算法有哪些?简单描述⼏个排序算法的优缺点?
答:选择、冒泡、快速、希尔、归并、堆排等。
1.快排:是冒泡排序的⼀种改进。
优点:快,数据移动少
缺点:稳定性不⾜
2.归并:分治法排序,稳定的排序算法,⼀般⽤于对总体⽆序,但局部有序的数列。
优点:效率⾼O(n),稳定
缺点:⽐较占⽤内存
问16: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指针。程序员最常用的编程语言
问17: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操作了。然⽽,当⼀个事件发⽣的时候,此完成端⼝就将被操作系统加⼊⼀个队列中。然后应⽤程序可以对核⼼层进⾏查询以得到此完成端⼝。
问18:同步IO和异步IO的区别?
答:
A. 同步
所谓同步,就是在发出⼀个功能调⽤时,在没有得到结果之前,该调⽤就不返回。
按照这个定义,其实绝⼤多数函数都是同步调⽤(例如sin isdigit等)。
但是⼀般⽽⾔,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要⼀定时间完成的任务。
最常见的例⼦就是 SendMessage。
该函数发送⼀个消息给某个窗⼝,在对⽅处理完消息之前,这个函数不返回。
当对⽅处理完毕以后,该函数才把消息处理函数所返回的值返回给调⽤者。
B. 异步
异步的概念和同步相对。
当⼀个异步过程调⽤发出后,调⽤者不会⽴刻得到结果。
实际处理这个调⽤的部件是在调⽤发出后,通过状态、通知来通知调⽤者,或通过回调函数处理这个调⽤。
问19:解释C++中静态函数和静态变量?
答:
(1)类静态数据成员在编译时创建并初始化:在该类的任何对象建⽴之前就存在,不属于任何对象,⽽⾮静态类成员变量则是属于对象所有的。类静态数据成员只有⼀个拷贝,为所有此类的对象所共享。
(2)类静态成员函数属于整个类,不属于某个对象,由该类所有对象共享。
1、static 成员变量实现了同类对象间信息共享。
2、static 成员类外存储,求类⼤⼩,并不包含在内。
3、static 成员是命名空间属于类的全局变量,存储在 data 区的rw段。
4、static 成员只能类外初始化。
5、可以通过类名访问(⽆对象⽣成时亦可),也可以通过对象访问。
问20:说下你对内存的了解?
答:
1.栈 - 由编译器⾃动分配释放
2.堆 - ⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区),全局变量和静态变量的存储是放在⼀块的,初始化的全局变量和静态变量在⼀块区域,未初始化的全局变量和未初始化的静态变量在相邻的另⼀块区域。- 程序结束释放
4.另外还有⼀个专门放常量的地⽅。- 程序结束释放
5 程序代码区,存放2进制代码。
在函数体中定义的变量通常是在栈上,⽤malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪⾥都存放在全局区(静态区),在所有函数体外定义的static变量表⽰在该⽂件中有效,不能extern到别的⽂件⽤,在函数体内定义的static表⽰只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论