c++程序员招聘笔试大全(详解)_第1页
c++程序员招聘笔试大全(详解)_第2页
c++程序员招聘笔试大全(详解)_第3页
c++程序员招聘笔试大全(详解)_第4页
c++程序员招聘笔试大全(详解)_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c/c+ HYPERLINK /bishi/ 笔试试题及分分析目大大全单向链表表的反转转是一个个经常被被问到的的一个 HYPERLINK /mianshi/ 面面试题,也也是一个个非常基基础的问问题。比比如一个个链表是是这样的的: 11-22-33-44-55 通过过反转后后成为55-44-33-22-11。最容易想想到的方方法遍历历一遍链链表,利利用一个个辅助指指针,存存储遍历历过程中中当前指指针指向向的下一一个元素素,然后后将当前前节点元元素的指指针反转转后,利利用已经经存储的的指针往往后面继继续遍历历。源代代码如下下:1. sstruuct linnka 2. innt ddataa;3

2、. liinkaa* nnextt;4. ;5. voiid rreveersee(liinkaa*& heaad) 6. iff(heead nulll)77. rretuurn;8. linnka *prre, *cuur, *nee;9. prre=hheadd;100. ccur=heaad-nexxt;111. whiile(curr)122. 13. nee = curr-nnextt;144. ccur-neext = ppre;15. prre = cuur;116. curr = ne;17. 118. heaad-nexxt = nuull;19. heead = ppre

3、;20. 还有一种种利用递递归的方方法。这这种方法法的基本本思想是是在反转转当前节节点之前前先调用用递归函函数反转转后续节节点。源源代码如如下。不不过这个个方法有有一个缺缺点,就就是在反反转后的的最后一一个结点点会形成成一个环环,所以以必须将将函数的的返回的的节点的的nexxt域置置为nuull。因为要要改变hheadd指针,所所以我用用了引用用。算法法的源代代码如下下:1. llinkka* revversse(llinkka* p,llinkka*& heead)2. 3. iff(p nulll | pp-nnextt nuull)4. 5. heead=p;66. rretuurn p

4、;77. 8. elsse9. 110. linnka* tmmp = reeverrse(p-nexxt,hheadd);111. tmpp-nnextt = p;112. retturnn p;13. 114. 已知sstriing类类定义如如下:classs sstriingpubblicc:sttrinng(cconsst ccharr *sstr = nnulll); / 通用构构造函数数strringg(coonstt sttrinng &anootheer); / 拷贝贝构造函函数 strringg(); / 析构构函数sstriing & ooperrateer =(coons

5、tt sttrinng &rhss); / 赋值函函数prrivaate:chaar *m_ddataa; / 用用于保存存字符串串;尝试写出出类的成成员函数数实现。答案:striing:sttrinng(cconsst ccharr *sstr)if ( sstr nulll ) /strrlenn在参数数为nuull时时会抛异异常才会会有这步步判断m_ddataa = neww chhar1 ;m_datta00 = cconttentt ;elssem_ddataa = neww chharstrrlenn(sttr) + 11;sstrccpy(m_ddataa,sttr);strii

6、ng:sttrinng(cconsst sstriing &annothher)m_ddataa = neww chharstrrlenn(annothher.m_ddataa) + 1;sttrcppy(mm_daata,othher.m_ddataa);striing& sttrinng:opeerattor =(cconsst sstriing &rhhs)if ( tthiss &rrhs)retturnn *tthiss ; mm_daata; /删除原原来的数数据,新新开一块块内存mm_daata = nnew chaarsstrllen(rhss.m_datta) + 11;ss

7、trccpy(m_ddataa,rhhs.mm_daata);reeturrn *thiis ;striing:sstriing() m_ddataa ;网上流流传的cc+笔笔试题汇汇总1.求下面面函数的的返回值值(微软软)int funnc(xx)intt coounttx = 0;whiile(x)couuntxx +;x = xx&(xx-1);retturnn coounttx;假定x = 999999。 答答案:88思路:将将x转化化为2进进制,看看含有的的1的个个数。2. 什什么是“引用”?申明明和使用用“引用”要注意意哪些问问题?答:引用用就是某某个目标标变量的的“别名”(all

8、iass),对对应用的的操作与与对变量量直接操操作效果果完全相相同。申申明一个个引用的的时候,切切记要对对其进行行初始化化。引用用声明完完毕后,相相当于目目标变量量名有两两个名称称,即该该目标原原名称和和引用名名,不能能再把该该引用名名作为其其他变量量名的别别名。声声明一个个引用,不不是新定定义了一一个变量量,它只只表示该该引用名名是目标标变量名名的一个个别名,它它本身不不是一种种数据类类型,因因此引用用本身不不占存储储单元,系系统也不不给引用用分配存存储单元元。不能能建立数数组的引引用。3. 将将“引用”作为函函数参数数有哪些些特点?(1)传传递引用用给函数数与传递递指针的的效果是是一样的的

9、。这时时,被调调函数的的形参就就成为原原来主调调函数中中的实参参变量或或对象的的一个别别名来使使用,所所以在被被调函数数中对形形参变量量的操作作就是对对其相应应的目标标对象(在在主调函函数中)的的操作。(2)使使用引用用传递函函数的参参数,在在内存中中并没有有产生实实参的副副本,它它是直接接对实参参操作;而使用用一般变变量传递递函数的的参数,当当发生函函数调用用时,需需要给形形参分配配存储单单元,形形参变量量是实参参变量的的副本;如果传传递的是是对象,还还将调用用拷贝构构造函数数。因此此,当参参数传递递的数据据较大时时,用引引用比用用一般变变量传递递参数的的效率和和所占空空间都好好。(3)使使

10、用指针针作为函函数的参参数虽然然也能达达到与使使用引用用的效果果,但是是,在被被调函数数中同样样要给形形参分配配存储单单元,且且需要重重复使用用*指指针变量量名的的形式进进行运算算,这很很容易产产生错误误且程序序的阅读读性较差差;另一一方面,在在主调函函数的调调用点处处,必须须用变量量的地址址作为实实参。而而引用更更容易使使用,更更清晰。4. 在在什么时时候需要要使用“常引用用”?如果既要要利用引引用提高高程序的的效率,又又要保护护传递给给函数的的数据不不在函数数中被改改变,就就应使用用常引用用。常引引用声明明方式:connst 类型标标识符 &引用用名=目目标变量量名;例1int a ;co

11、nnst intt &rra=aa;raa=1; /错误aa=1; /正确例2striing fooo( );vooid barr(sttrinng & s);那么下面面的表达达式将是是非法的的:bar(fooo( );bbar(heelloo woorldd);原因在于于fooo( )和hhelllo wworlld串串都会产产生一个个临时对对象,而而在c+中,这这些临时时对象都都是coonstt类型的的。因此此上面的的表达式式就是试试图将一一个coonstt类型的的对象转转换为非非connst类类型,这这是非法法的。引用型参参数应该该在能被被定义为为connst的的情况下下,尽量量定义为为

12、connst 。5. 将将“引用”作为函函数返回回值类型型的格式式、好处处和需要要遵守的的规则?格式:类类型标识识符 &函数名名(形参参列表及及类型说说明) /函数体体 好处:在在内存中中不产生生被返回回值的副副本;(注注意:正正是因为为这点原原因,所所以返回回一个局局部变量量的引用用是不可可取的。因为随随着该局局部变量量生存期期的结束束,相应应的引用用也会失失效,产产生ruuntiime errror!注意事项项:(1)不不能返回回局部变变量的引引用。这这条可以以参照eeffeectiive c+1的ittem 31。主要原原因是局局部变量量会在函函数返回回后被销销毁,因因此被返返回的引引用

13、就成成为了无所指指的引引用,程程序会进进入未知知状态。(2)不不能返回回函数内内部neew分配配的内存存的引用用。这条条可以参参照efffecctivve cc+1的的iteem 331。虽虽然不存存在局部部变量的的被动销销毁问题题,可对对于这种种情况(返返回函数数内部nnew分分配内存存的引用用),又又面临其其它尴尬尬局面。例如,被被函数返返回的引引用只是是作为一一个临时时变量出出现,而而没有被被赋予一一个实际际的变量量,那么么这个引引用所指指向的空空间(由由neww分配)就就无法释释放,造造成meemorry lleakk。(3)可可以返回回类成员员的引用用,但最最好是cconsst。这这

14、条原则则可以参参照efffecctivve cc+1的的iteem 330。主主要原因因是当对对象的属属性是与与某种业业务规则则(buusinnesss ruule)相相关联的的时候,其其赋值常常常与某某些其它它属性或或者对象象的状态态有关,因因此有必必要将赋赋值操作作封装在在一个业业务规则则当中。如果其其它对象象可以获获得该属属性的非非常量引引用(或或指针),那那么对该该属性的的单纯赋赋值就会会破坏业业务规则则的完整整性。(4)流流操作符符重载返返回值申申明为“引用”的作用用:流操作符符,这这两个操操作符常常常希望望被连续续使用,例例如:ccoutt hhelllo enddl;因此这这两个

15、操操作符的的返回值值应该是是一个仍仍然支持持这两个个操作符符的流引引用。可可选的其其它方案案包括:返回一一个流对对象和返返回一个个流对象象指针。但是对对于返回回一个流流对象,程程序必须须重新(拷拷贝)构构造一个个新的流流对象,也也就是说说,连续续的两个个操操作符实实际上是是针对不不同对象象的!这这无法让让人接受受。对于于返回一一个流指指针则不不能连续续使用操作作符。因因此,返返回一个个流对象象引用是是惟一选选择。这这个唯一一选择很很关键,它它说明了了引用的的重要性性以及无无可替代代性,也也许这就就是c+语言言中引入入引用这这个概念念的原因因吧。赋赋值操作作符=。这个操操作符象象流操作作符一样样

16、,是可可以连续续使用的的,例如如:x = jj = 10;或者(x=110)=1000;赋值值操作符符的返回回值必须须是一个个左值,以以便可以以被继续续赋值。因此引引用成了了这个操操作符的的惟一返返回值选选择。例3i nncluude intt &pput(intt n);innt vvalss100;iint errror=-1;voiid mmainn()putt(0)=100; /以pput(0)函函数值作作为左值值,等价价于vaals0=10;putt(9)=200; /以pput(9)函函数值作作为左值值,等价价于vaals9=20;couutvalls00;ccoutt=0 & n

17、=9 ) reeturrn vvalssn;ellse ccouttsubbscrriptt errrorr; retturnn errrorr; (5)在在另外的的一些操操作符中中,却千千万不能能返回引引用:+-*/ 四则则运算符符。它们们不能返返回引用用,efffecctivve cc+1的的iteem233详细的的讨论了了这个问问题。主主要原因因是这四四个操作作符没有有sidde eeffeect,因因此,它它们必须须构造一一个对象象作为返返回值,可可选的方方案包括括:返回回一个对对象、返返回一个个局部变变量的引引用,返返回一个个neww分配的的对象的的引用、返回一一个静态态对象引引用。

18、根根据前面面提到的的引用作作为返回回值的三三个规则则,第22、3两两个方案案都被否否决了。静态对对象的引引用又因因为(a+bb) (c+dd)会会永远为为truue而导导致错误误。所以以可选的的只剩下下返回一一个对象象了。6. “引用”与多态态的关系系?引用是除除指针外外另一个个可以产产生多态态效果的的手段。这意味味着,一一个基类类的引用用可以指指向它的的派生类类实例。例4classs aa; cclasss bb : claass a.; bb b; a& reef = b;7. “引用”与指针针的区别别是什么么?指针通过过某个指指针变量量指向一一个对象象后,对对它所指指向的变变量间接接操作

19、。程序中中使用指指针,程程序的可可读性差差;而引引用本身身就是目目标变量量的别名名,对引引用的操操作就是是对目标标变量的的操作。此外,就就是上面面提到的的对函数数传reef和ppoinnterr的区别别。8. 什什么时候候需要“引用”?流操作符符、赋值操操作符=的返回回值、拷拷贝构造造函数的的参数、赋值操操作符=的参数数、其它它情况都都推荐使使用引用用。以上 22-8 参考:htttp:/bllog.csddn.ccom/wfwwd/aarchhivee/20006/05/30/76335511.asspx9. 结结构与联联合有和和区别?1. 结构和和联合都都是由多多个不同同的数据据类型成成员

20、组成成, 但但在任何何同一时时刻, 联合中中只存放放了一个个被选中中的成员员(所有有成员共共用一块块地址空空间), 而结结构的所所有成员员都存在在(不同同成员的的存放地地址不同同)。22. 对对于联合合的不同同成员赋赋值, 将会对对其它成成员重写写, 原原来成员员的值就就不存在在了, 而对于于结构的的不同成成员赋值值是互不不影响的的。10. 下面关关于“联合”的题目目的输出出?a)i nncluude uniionintt i;chaar xx2;aa;voidd maain()a.xx0 = 10;a.xx1 = 1;pprinntf(%dd,aa.i);答案:2666 (低低位低地地址,高

21、高位高地地址,内内存占用用情况是是ox0010aa)b)mainn()uniion /*定义一一个联合合*/iint i;sstruuct /*在联合合中定义义一个结结构*/chaar ffirsst;ccharr seeconnd;hallf;nummberr;nuumbeer.ii=0 xx42441; /*联联合成员员赋值*/prrinttf(%c%cnn, nummberr.haalf.firrst, muumbeer.hhalff.seeconnd);nummberr.haalf.firrst=a; /*联联合中结结构成员员赋值*/nuumbeer.hhalff.seeconnd=b

22、b;prrinttf(%xn, nuumbeer.ii);ggetcch();答案: abb (00 x411对应aa,是低低位;oox422对应bb,是高高位)62611 (nnumbber.i和nnumbber.hallf共用用一块地地址空间间)11. 已知sstrccpy的的函数原原型:ccharr *sstrccpy(chaar *strrdesst, connst chaar *strrsrcc)其中中strrdesst 是是目的字字符串,sstrssrc 是源字字符串。不调用用c+/c 的字符符串库函函数,请请编写函函数 sstrccpy。答案:ccharr *sstrccpy(c

23、haar *strrdesst, connst chaar *strrsrcc)if ( sstrddestt nuull | strrsrcc nuull)retturnn nuull ;iff ( strrdesst sstrssrc)retturnn sttrdeest ;chhar *teemppptr = sstrddestt ;wwhille( (*sstrddestt+ = *strrsrcc+) != coonteent)retturnn teemppptr ;12. 已知striing类类定义如如下:classs sstriingpubblicc:sttrinng(ccons

24、st ccharr *sstr = nnulll); / 通用构构造函数数strringg(coonstt sttrinng &anootheer); / 拷贝贝构造函函数 strringg(); / 析构构函数sstriing & ooperrateer =(coonstt sttrinng &rhss); / 赋值函函数prrivaate:chaar *m_ddataa; / 用用于保存存字符串串;尝试写出出类的成成员函数数实现。答案:striing:sttrinng(cconsst ccharr *sstr)if ( sstr nulll ) /strrlenn在参数数为nuull时时会

25、抛异异常才会会有这步步判断m_ddataa = neww chhar1 ;m_datta00 = cconttentt ;elssem_ddataa = neww chharstrrlenn(sttr) + 11;sstrccpy(m_ddataa,sttr);striing:sttrinng(cconsst sstriing &annothher)m_ddataa = neww chharstrrlenn(annothher.m_ddataa) + 1;sttrcppy(mm_daata,othher.m_ddataa);striing& sttrinng:opeerattor =(ccon

26、sst sstriing &rhhs)if ( tthiss &rrhs)retturnn *tthiss ; mm_daata; /删除原原来的数数据,新新开一块块内存mm_daata = nnew chaarsstrllen(rhss.m_datta) + 11;sstrccpy(m_ddataa,rhhs.mm_daata);reeturrn *thiis ;striing:sstriing() m_ddataa ;13. .h头头文件中中的iffndeef/ddefiine/enddif 的作用用?答:防止止该头文文件被重重复引用用。14. i nclludee 与 i nncluud

27、e fiile.h的的区别?答:前者者是从sstanndarrd llibrraryy的路径径寻找和和引用ffilee.h,而而后者是是从当前前 HYPERLINK 工作路径径搜寻并并引用ffilee.h。15.在在c+ 程序序中调用用被c 编译器器编译后后的函数数,为什什么要加加extternn “c”?首先,作作为exxterrn是cc/c+语言言中表明明函数和和全局变变量作用用范围(可可见性)的的关键字字,该关关键字告告诉编译译器,其其声明的的函数和和变量可可以在本本模块或或其它模模块中使使用。通常,在在模块的的头文件件中对本本模块提提供给其其它模块块引用的的函数和和全局变变量以关关键字

28、eexteern声声明。例例如,如如果模块块b欲引引用该模模块a中中定义的的全局变变量和函函数时只只需包含含模块aa的头文文件即可可。这样样,模块块b中调调用模块块a中的的函数时时,在编编译阶段段,模块块b虽然然找不到到该函数数,但是是并不会会报错;它会在在连接阶阶段中从从模块aa编译生生成的目目标代码码中找到到此函数数exteern c是连接接申明(linnkagge ddecllaraatioon),被exxterrn c修修饰的变变量和函函数是按按照c语语言方式式编译和和连接的的,来看看看c+中对对类似cc的函数数是怎样样编译的的:作为一种种面向对对象的语语言,cc+支支持函数数重载,而

29、而过程式式语言cc则不支支持。函函数被cc+编编译后在在符号库库中的名名字与cc语言的的不同。例如,假假设某个个函数的的原型为为:voidd fooo( intt x, innt yy );该函数被被c编译译器编译译后在符符号库中中的名字字为_ffoo,而而c+编译器器则会产产生像_fooo_innt_iint之之类的名名字(不不同的编编译器可可能生成成的名字字不同,但但是都采采用了相相同的机机制,生生成的新新名字称称为“manngleed nnamee”)。_fooo_innt_iint 这样的的名字包包含了函函数名、函数参参数数量量及类型型信息,cc+就就是靠这这种机制制来实现现函数重重载

30、的。例如,在在c+中,函函数vooid fooo( iint x, intt y )与vvoidd fooo( intt x, flloatt y )编译译生成的的符号是是不相同同的,后后者为_fooo_innt_ffloaat。同样地,cc+中中的变量量除支持持局部变变量外,还还支持类类成员变变量和全全局变量量。用户户所编写写程序的的类成员员变量可可能与全全局变量量同名,我我们以.来来区分。而本质质上,编编译器在在进行编编译时,与与函数的的处理相相似,也也为类中中的变量量取了一一个独一一无二的的名字,这这个名字字与用户户程序中中同名的的全局变变量名字字不同。未加exxterrn c声声明时的

31、的连接方方式假设在cc+中中,模块块a的头头文件如如下:/ 模模块a头头文件modduleea.hh#iffndeef mmoduule_a_hh#deefinne mmoduule_a_hhintt fooo( intt x, innt yy );#enndiff在模块bb中引用用该函数数:/ 模模块b实实现文件件moodulleb.cpppi nclludee mmoduuleaa.hfooo(2,3);实际上,在在连接阶阶段,连连接器会会从模块块a生成成的目标标文件mmoduuleaa.obbj中寻寻找_ffoo_intt_innt这样样的符号号!加extternn cc声明明后的编编译

32、和连连接方式式加extternn cc声明明后,模模块a的的头文件件变为:/ 模模块a头头文件modduleea.hh#iffndeef mmoduule_a_hh#deefinne mmoduule_a_hhextternn cc iint fooo( iint x, intt y );#enddif在模块bb的实现现文件中中仍然调调用fooo( 2,33 ),其其结果是是:(11)模块块a编译译生成ffoo的的目标代代码时,没没有对其其名字进进行特殊殊处理,采采用了cc语言的的方式;(2)连连接器在在为模块块b的目目标代码码寻找ffoo(2,33)调用用时,寻寻找的是是未经修修改的符符号名

33、_fooo。如果在模模块a中中函数声声明了ffoo为为extternn cc类型型,而模模块b中中包含的的是exxterrn iint fooo( iint x, intt y ) ,则则模块bb找不到到模块aa中的函函数;反反之亦然然。所以,可可以用一一句话概概括exxterrn “c”这个声声明的真真实目的的(任何何语言中中的任何何语法特特性的诞诞生都不不是随意意而为的的,来源源于真实实世界的的需求驱驱动。我我们在思思考问题题时,不不能只停停留在这这个语言言是怎么么做的,还还要问一一问它为为什么要要这么做做,动机机是什么么,这样样我们可可以更深深入地理理解许多多问题):实现cc+与与c及其

34、其它语言言的混合合编程。明白了cc+中中extternn cc的设设立动机机,我们们下面来来具体分分析exxterrn c通通常的使使用技巧巧:exteern c的惯用用法(1)在在c+中引用用c语言言中的函函数和变变量,在在包含cc语言头头文件(假假设为ccexaamplle.hh)时,需需进行下下列处理理:exteern ci nclludee ccexaamplle.hh而在c语语言的头头文件中中,对其其外部函函数只能能指定为为extternn类型,cc语言中中不支持持extternn cc声明明,在.c文件件中包含含了exxterrn c时时会出现现编译语语法错误误。c+引引用c函函数

35、例子子工程中中包含的的三个文文件的源源代码如如下:/* cc语言头头文件:cexxampple.h */#iifnddef c_eexammplee_h#deffinee c_exaamplle_hhextternn innt aadd(intt x,intt y);#eendiif/* cc语言实实现文件件:ceexammplee.c */i nncluude ceexammplee.hintt addd( intt x, innt yy )retturnn x + yy;/ cc+实实现文件件,调用用addd:cpppfiile.cpppextternn cci nclludee ccex

36、aamplle.hhintt maain(intt arrgc, chhar* arrgv)addd(2,3);retturnn 0;如果c+调用用一个cc语言编编写的.dlll时,当当包括.dlll的头文文件或声声明接口口函数时时,应加加extternn cc 。(2)在在c中引引用c+语言言中的函函数和变变量时,cc+的的头文件件需添加加extternn cc,但但是在cc语言中中不能直直接引用用声明了了extternn cc的该该头文件件,应该该仅将cc文件中中将c+中定定义的eexteern c函数声声明为eexteern类类型。c引用cc+函函数例子子工程中中包含的的三个文文件的源源

37、代码如如下:/c+头文文件 ccppeexammplee.h#ifnndeff cppp_eexammplee_h#deffinee cppp_eexammplee_heexteern c innt aadd( innt xx, iint y );#eendiif/c+实现现文件 cpppexaamplle.ccppi nncluude cpppexxampple.hiint addd( iint x, intt y )retturnn x + yy;/* cc实现文文件 ccfille.cc/* 这样会会编译出出错:i nncluude ceexammplee.h */extternn in

38、nt aadd( innt xx, iint y );innt mmainn( iint arggc, chaar* arggv )addd( 22, 33 );retturnn 0;15题目目的解答答请参考考c+中eexteern “c”含义深深层探索索注解解:16. 关联、聚合(agggreggatiion)以及组组合(ccompposiitioon)的的区别?涉及到uuml中中的一些些概念:关联是是表示两两个类的的一般性性联系,比比如“学生”和“老师”就是一一种关联联关系;聚合表表示haas-aa的关系系,是一一种相对对松散的的关系,聚聚合类不不需要对对被聚合合类负责责,如下下图所示示,

39、用空空的菱形形表示聚聚合关系系:从实现的的角度讲讲,聚合合可以表表示为:classs aa . cllasss b aa* aa; .而组合表表示coontaainss-a的的关系,关关联性强强于聚合合:组合合类与被被组合类类有相同同的生命命周期,组组合类要要对被组组合类负负责,采采用实心心的菱形形表示组组合关系系:实现的形形式是:classs aa. claass b a aa; .参考文章章:htttp:/m/wffwd/arcchivve/220066/055/300/76637553.aaspxxhttpp:/bloog.ccsdnn.coom/wwfwdd/arrchiive/200

40、06/005/330/77637760.asppx17.面面向对象象的三个个基本特特征,并并简单叙叙述之?1. 封封装:将将客观事事物抽象象成类,每每个类对对自身的的数据和和方法实实行prroteectiion(priivatte, prootecctedd,puubliic)2. 继继承:广广义的继继承有三三种实现现形式:实现继继承(指指使用基基类的属属性和方方法而无无需额外外编码的的能力)、可视继继承(子子窗体使使用父窗窗体的外外观和实实现代码码)、接接口继承承(仅使使用属性性和方法法,实现现滞后到到子类实实现)。前两种种(类继继承)和和后一种种(对象象组合=接口口继承以以及纯虚虚函数)构

41、构成了功功能复用用的两种种方式。3. 多多态:是是将父对对象设置置成为和和一个或或更多的的他的子子对象相相等的技技术,赋赋值之后后,父对对象就可可以根据据当前赋赋值给它它的子对对象的特特性以不不同的方方式运作作。简单单的说,就就是一句句话:允允许将子子类类型型的指针针赋值给给父类类类型的指指针。18. 重载(ooverrloaad)和和重写(oveerriied,有有的书也也叫做“覆盖”)的区区别?常考的题题目。从从定义上上来说:重载:是是指允许许存在多多个同名名函数,而而这些函函数的参参数表不不同(或或许参数数个数不不同,或或许参数数类型不不同,或或许两者者都不同同)。重写:是是指子类类重新

42、定定义复类类虚函数数的方法法。从实现原原理上来来说:重载:编编译器根根据函数数不同的的参数表表,对同同名函数数的名称称做修饰饰,然后后这些同同名函数数就成了了不同的的函数(至至少对于于编译器器来说是是这样的的)。如如,有两两个同名名函数: fuuncttionn fuunc(p:iinteegerr):iinteegerr;和ffuncctioon ffuncc(p:strringg):iinteegerr;。那那么编译译器做过过修饰后后的函数数名称可可能是这这样的:intt_fuunc、strr_fuunc。对于这这两个函函数的调调用,在在编译器器间就已已经确定定了,是是静态的的。也就就是说

43、,它它们的地地址在编编译期就就绑定了了(早绑绑定),因因此,重重载和多多态无关关!重写:和和多态真真正相关关。当子子类重新新定义了了父类的的虚函数数后,父父类指针针根据赋赋给它的的不同的的子类指指针,动动态的调调用属于于子类的的该函数数,这样样的函数数调用在在编译期期间是无无法确定定的(调调用的子子类的虚虚函数的的地址无无法给出出)。因因此,这这样的函函数地址址是在运运行期绑绑定的(晚晚绑定)。19. 多态的的作用?主要是两两个:11. 隐隐藏实现现细节,使使得代码码能够模模块化;扩展代代码模块块,实现现代码重重用;22. 接接口重用用:为了了类在继继承和派派生的时时候,保保证使用用家族中中任

44、一类类的实例例的某一一属性时时的正确确调用。20. adoo与addo.ccom的的相同与与不同?除了“能能够让应应用程序序处理存存储于ddbmss 中的的数据“这一基基本相似似点外,两两者没有有太多共共同之处处。但是是adoo使用oole db 接口并并基于微微软的ccom 技术,而而adoo.neet 拥拥有自己己的addo.nnet 接口并并且基于于微软的的.neet 体体系架构构。众所所周知.nett 体系系不同于于comm 体系系,addo.nnet 接口也也就完全全不同于于adoo和olle ddb 接接口,这这也就是是说addo.nnet 和addo是两两种数据据访问方方式。m

45、提供供对xmml 的的支持。21. neww 与与malllocc frree 的联系系与区别别?答案案:都是是在堆(heaap)上上进行动动态的内内存操作作。用mmallloc函函数需要要指定内内存分配配的字节节数并且且不能初初始化对对象,nnew 会自动动调用对对象的构构造函数数。 会会调用对对象的ddesttrucctorr,而ffreee 不会会调用对对象的ddesttrucctorr.22. #deefinne ddoubble(x) x+xx ,ii = 5*ddoubble(5); i 是多少少?答案案:i 为300。23. 有哪几几种情况况只能用用inttiallizaatio

46、on llistt 而不不能用aassiignmmentt?答案:当当类中含含有coonstt、reeferrencce 成成员变量量;基类类的构造造函数都都需要初初始化表表。24. c+是不是是类型安安全的?答案:不是。两个不不同类型型的指针针之间可可以强制制转换(用用reiinteerprret casst)。c#是是类型安安全的。25. maiin 函函数执行行以前,还还会执行行什么代代码?答答案:全全局对象象的构造造函数会会在maain 函数之之前执行行。26. 描述内内存分配配方式以以及它们们的区别别?1) 从静态态存储区区域分配配。内存存在程序序编译的的时候就就已经分分配好,这这块

47、内存存在程序序的整个个运行期期间都存存在。例例如全局局变量,sstattic 变量。2) 在栈上上创建。在执行行函数时时,函数数内局部部变量的的存储单单元都可可以在栈栈上创建建,函数数执行结结束时这这些存储储单元自自动被释释放。栈栈内存分分配运算算内置于于处理器器的指令令集。33) 从从堆上分分配,亦亦称动态态内存分分配。程程序在运运行的时时候用mmallloc 或neew 申申请任意意多少的的内存,程程序员自自己负责责在何时时用frree 或 释释放内存存。动态态内存的的生存期期由程序序员决定定,使用用非常灵灵活,但但问题也也最多。27.sstruuct 和 cclasss 的的区别答案:s

48、struuct 的成员员默认是是公有的的,而类类的成员员默认是是私有的的。sttrucct 和和 cllasss 在其其他方面面是功能能相当的的。从感情上上讲,大大多数的的开发者者感到类类和结构构有很大大的差别别。感觉觉上结构构仅仅象象一堆缺缺乏封装装和功能能的开放放的内存存位,而而类就象象活的并并且可靠靠的社会会成员,它它有智能能服务,有有牢固的的封装屏屏障和一一个良好好定义的的接口。既然大大多数人人都这么么认为,那那么只有有在你的的类有很很少的方方法并且且有公有有数据(这这种事情情在良好好设计的的系统中中是存在在的!)时时,你也也许应该该使用 strructt 关键键字,否否则,你你应该使

49、使用 cclasss 关关键字。28.当当一个类类a 中中没有生生命任何何成员变变量与成成员函数数,这时时sizzeoff(a)的值是是多少,如如果不是是零,请请解释一一下编译译器为什什么没有有让它为为零。(aautoodessk)答答案:肯肯定不是是零。举举个反例例,如果果是零的的话,声声明一个个claass a110对对象数组组,而每每一个对对象占用用的空间间是零,这这时就没没办法区区分a0,a11了。29. 在80086 汇编下下,逻辑辑地址和和物理地地址是怎怎样转换换的?(iinteel)答答案:通通用寄存存器给出出的地址址,是段段内偏移移地址,相相应段寄寄存器地地址*110h+通用寄

50、寄存器内内地址,就就得到了了真正要要访问的的地址。30. 比较cc+中中的4种种类型转转换方式式?请参考:htttp:/bllog.csddn.ccom/wfwwd/aarchhivee/20006/05/30/76337855.asspx,重重点是sstattic_casst, dynnamiic_ccastt和reeintterpprett_caast的的区别和和应用。31.分分别写出出boool,iint,flooat,指针类类型的变变量a 与“零”的比较较语句。答案:boool : iff ( !a ) oor iif(aa)innt : iff ( a 00)flloatt : co

51、nnst exppresssioon eexp = 00.00000001iff ( a -expp)poointter : iif ( a != nulll) or if(a nnulll)32.请请说出cconsst与#deffinee 相比比,有何何优点?答案:1) connst 常量有有数据类类型,而而宏常量量没有数数据类型型。编译译器可以以对前者者进行类类型安全全检查。而对后后者只进进行字符符替换,没没有类型型安全检检查,并并且在字字符替换换可能会会产生意意料不到到的错误误。2) 有些集集成化的的调试工工具可以以对coonstt 常量量进行调调试,但但是不能能对宏常常量进行行调试。3

52、3.简简述数组组与指针针的区别别?数组组要么在在静态存存储区被被创建(如如全局数数组),要要么在栈栈上被创创建。指指针可以以随时指指向任意意类型的的内存块块。(11)修改改内容上上的差别别chaar aa = “helllo”;a00 = x;chaar *p = “worrld”; / 注注意p 指向常常量字符符串p0 = x; / 编编译器不不能发现现该错误误,运行行时错误误(2) 用运运算符ssizeeof 可以计计算出数数组的容容量(字字节数)。sizzeoff(p),p 为指针针得到的的是一个个指针变变量的字字节数,而而不是pp 所指指的内存存容量。c+/c 语言没没有办法法知道指指

53、针所指指的内存存容量,除除非在申申请内存存时记住住它。注注意当数数组作为为函数的的参数进进行传递递时,该该数组自自动退化化为同类类型的指指针。ccharr a = hhelllo wworlld;chaar *p = a;couut siizeoof(aa) eendll; / 112 字字节coout ssizeeof(p) enddl; / 4 字字节计算算数组和和指针的的内存容容量vooid funnc(ccharr a1000)couut siizeoof(aa) eendll; / 44 字节节而不是是1000 字节节34.类类成员函函数的重重载、覆覆盖和隐隐藏区别别?答案案:a.成

54、员函函数被重重载的特特征:(11)相同同的范围围(在同同一个类类中);(2)函函数名字字相同;(3)参参数不同同;(44)viirtuual 关键字字可有可可无。bb.覆盖盖是指派派生类函函数覆盖盖基类函函数,特特征是:(1)不不同的范范围(分分别位于于派生类类与基类类);(22)函数数名字相相同;(33)参数数相同;(4)基基类函数数必须有有virrtuaal 关关键字。c.“隐藏”是指派派生类的的函数屏屏蔽了与与其同名名的基类类函数,规规则如下下:(11)如果果派生类类的函数数与基类类的函数数同名,但但是参数数不同。此时,不不论有无无virrtuaal关键键字,基基类的函函数将被被隐藏(注

55、注意别与与重载混混淆)。(2)如如果派生生类的函函数与基基类的函函数同名名,并且且参数也也相同,但但是基类类函数没没有viirtuual 关键字字。此时时,基类类的函数数被隐藏藏(注意意别与覆覆盖混淆淆)35. theere aree twwo iint varriabbless: aa annd bb, ddont uuse “if”, “? :”, “swiitchh”or othher juddgemmentt sttateemennts, fiind outt thhe bbigggestt onne oof tthe twoo nuumbeers.答案:( ( a + bb ) +

56、aabs( a - bb ) ) / 236. 如何打打印出当当前源文文件的文文件名以以及源文文件的当当前行号号?答案案:coout _ffilee_ ;coout_linne_ ;_fiile_和_liine_是系系统预定定义宏,这这种宏并并不是在在某个文文件中定定义的,而而是由编编译器定定义的。37. maiin 主主函数执执行完毕毕后,是是否可能能会再执执行一段段代码,给给出说明明?答案案:可以以,可以以用_oonexxit 注册一一个函数数,它会会在maain 之后执执行innt ffn1(voiid), fnn2(vvoidd), fn33(vooid), ffn4 (vooid);

57、vooid maiin( voiid )strringg sttr(zhaangllin);_oneexitt( ffn1 );_oneexitt( ffn2 );_oneexitt( ffn3 );_oneexitt( ffn4 );pprinntf( tthiss iss exxecuutedd fiirstt.nn );intt fnn1()priintff( nexxt.n );rretuurn 0;intt fnn2()priintff( exeecutted );reeturrn 00;intt fnn3()priintff( is );reeturrn 00;intt fnn4(

58、)priintff( thiis );retturnn 0;thee _oonexxit funnctiion is passsedd thhe aaddrresss off a funnctiion (fuunc) too bee caalleed wwhenn thhe pproggramm teermiinattes norrmallly. suucceessiive callls to _onnexiit ccreaate a rregiisteer oof ffuncctioons thaat aare exeecutted in liffo (lasst-iin-ffirsst-o

59、out) orrderr. tthe funnctiionss paasseed tto _oneexitt caannoot ttakee paarammeteers.38. 如何判判断一段段程序是是由c 编译程程序还是是由c+编译译程序编编译的?答案:#iffdeff _cplluspplusscouutc+;#ellseccouttc;#enndiff39.文文件中有有一组整整数,要要求排序序后输出出到另一一个文件件中答案案:i nncluudei nncluudeusinng nnameespaace stdd;voidd orrderr(veectoor& ddataa) /buub

60、blle ssorttintt coountt = datta.ssizee() ;innt ttag = ffalsse ; / 设置置是否需需要继续续冒泡的的标志位位forr ( intt i = 00 ; i coountt ; i+)forr ( intt j = 00 ; j dattajj+1)tagg = truue ;intt teemp = ddataaj ;ddataaj = dattajj+1 ;ddataaj+1 = ttempp ;if ( !tagg )bbreaak ;voidd maain( vooid )vecctorrddataa;iffstrreamm i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论