面试题有难有易,不能因为容易,我们就轻视,更不能因为难,我们就放弃。我们面对高薪就业的态度永远不变,那就是坚持、坚持、再坚持。出现问题,找原因;遇到困难,想办法。我们一直坚信只有在坚持中才能看到希望,而不是看到希望才去坚持。
人生没有如果,只有结果和后果。既然选择了,就不后悔。年轻就是资本,年轻就要吃苦,就要历练。就要学会在坚持中成长。如此感慨,至深的心得体会,绝对的经验之谈。
OK,进入正题,下面就是《必须掌握的20道技术面试题》
问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知道吗?解释其作用。
答:1.const修饰类的成员变数,表示成员常量,不能被修改。
2.const修饰函式承诺在本函式内部不会修改类内的数据成员,不会呼叫其它非const成员函式。
3.如果const构成函式过载,const物件只能呼叫const函式,非const物件优先呼叫非const函式。
4.const函式只能呼叫const函式。非const函式可以呼叫const函式。
5.类体外定义的const成员函式,在定义和宣告处都需要const修饰符。。
问9:类的static变数在什么时候初始化?函式的static变数在什么时候初始化?
答:类的静态成员变数在类例项化之前就已经存在了,并且分配了內存。函式的static变数在执行此函式时进行初始化。
遇到问题多百度,多找大神问也是很重要的,建议进这个群一起聊,跟前辈一起探讨,也会得到很多帮助。也可以交流学习心得,技术问题,可以获取PDF书籍源码、教程等给大家免费使用 。
问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、可以通过类名访问(无物件生成时亦可),也可以通过物件访问。
1、静态成员函式的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。
2、静态成员函式只能访问静态数据成员。原因:非静态成员函式,在呼叫时this指标时被当作参数传进。而静态成员函式属于类,而不属于物件,没有this指标。
问20:说下你对內存的了解?
答:
1.栈-由编译器自动分配释放
2.堆-一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局性区(静态区),全局性变数和静态变数的储存是放在一块的,初始化的全局性变数和静态变数在一块区域,未初始化的全局性变数和未初始化的静态变数在相邻的另一块区域。-程序结束释放
4.另外还有一个专门放常量的地方。-程序结束释放
5程序代码区,存放2进位制代码。
在函式体中定义的变数通常是在栈上,用malloc,calloc,realloc等分配內存的函式分配得到的就是在堆上。在所有函式体外定义的是全局性量,加了static修饰符后不管在哪里都存放在全局性区(静态区),在所有函式体外定义的static变量表示在该档案中有效,不能extern到别的档案用,在函式体内定义的static表示只在该函式体内有效。另外,函式中的“adgfdf”这样的字串存放在常量区。
遇到问题多百度,多找大神问也是很重要的,建议进这个群一起聊,跟前辈一起探讨,也会得到很多帮助。也可以交流学习心得,技术问题,可以获取PDF书籍源码、教程等给大家免费使用 。