c语言面试大全15327.docx
《c语言面试大全15327.docx》由会员分享,可在线阅读,更多相关《c语言面试大全15327.docx(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.求下面函数的返回值(微软)int func(x) int countx = 0; while(x) countx +; x = x&(x-1); return countx; 假定x = 9999。 答案:8思路:将xx转化为为2进制制,看含含有的11的个数数。2. 什么么是“引引用”?申明和和使用“引引用”要要注意哪哪些问题题?答:引用就就是某个个目标变变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是
2、新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。3. 将“引引用”作作为函数数参数有有哪些特特点?(1)传递递引用给给函数与与传递指指针的效效果是一一样的。这这时,被被调函数数的形参参就成为为原来主主调函数数中的实实参变量量或对象象的一个个别名来来使用,所所以在被被调函数数中对形形参变量量的操作作就是对对其相应应的目标标对象(在在主调函函数中)的的操作。(2)使用用引用传传递函数数的参数数,在内内存中并并没有产产生实参参的副本本,它是是直接对对实参操操作;而而使用一一般变量量传递函函数的
3、参参数,当当发生函函数调用用时,需需要给形形参分配配存储单单元,形形参变量量是实参参变量的的副本;如果传传递的是是对象,还还将调用用拷贝构构造函数数。因此此,当参参数传递递的数据据较大时时,用引引用比用用一般变变量传递递参数的的效率和和所占空空间都好好。(3)使用用指针作作为函数数的参数数虽然也也能达到到与使用用引用的的效果,但但是,在在被调函函数中同同样要给给形参分分配存储储单元,且且需要重重复使用用*指指针变量量名的的形式进进行运算算,这很很容易产产生错误误且程序序的阅读读性较差差;另一一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。4. 在什什么时候候需
4、要使使用“常常引用”?如果既要利利用引用用提高程程序的效效率,又又要保护护传递给给函数的的数据不不在函数数中被改改变,就就应使用用常引用用。常引引用声明明方式:connst 类型标标识符 &引用用名=目目标变量量名;例1int aa ;cconsst iint &raa=a;ra=1; /错错误a=1; /正正确 例2strinng ffoo( );voiid bbar(strringg & s); 那么下面的的表达式式将是非非法的:bar(ffoo( );baar(helllo worrld); 原因在于ffoo( )和和heelloo woorldd串都都会产生生一个临临时对象象,而在在C
5、+中,这这些临时时对象都都是coonstt类型的的。因此此上面的的表达式式就是试试图将一一个coonstt类型的的对象转转换为非非connst类类型,这这是非法法的。引用型参数数应该在在能被定定义为cconsst的情情况下,尽尽量定义义为coonstt 。5. 将“引引用”作作为函数数返回值值类型的的格式、好好处和需需要遵守守的规则则?格式:类型型标识符符 &函函数名(形形参列表表及类型型说明) /函数体体 好处:在内内存中不不产生被被返回值值的副本本;(注注意:正正是因为为这点原原因,所所以返回回一个局局部变量量的引用用是不可可取的。因因为随着着该局部部变量生生存期的的结束,相相应的引引用也
6、会会失效,产产生ruuntiime errror!注意事项:(1)不能能返回局局部变量量的引用用。这条条可以参参照Efffecctivve CC+1的的Iteem 331。主主要原因因是局部部变量会会在函数数返回后后被销毁毁,因此此被返回回的引用用就成为为了无无所指的引用用,程序序会进入入未知状状态。 (2)不能能返回函函数内部部neww分配的的内存的的引用。这这条可以以参照EEffeectiive C+1的Ittem 31。虽虽然不存存在局部部变量的的被动销销毁问题题,可对对于这种种情况(返返回函数数内部nnew分分配内存存的引用用),又又面临其其它尴尬尬局面。例例如,被被函数返返回的引引用
7、只是是作为一一个临时时变量出出现,而而没有被被赋予一一个实际际的变量量,那么么这个引引用所指指向的空空间(由由neww分配)就就无法释释放,造造成meemorry lleakk。(3)可以以返回类类成员的的引用,但但最好是是connst。这这条原则则可以参参照Efffecctivve CC+1的的Iteem 330。主主要原因因是当对对象的属属性是与与某种业业务规则则(buusinnesss ruule)相相关联的的时候,其其赋值常常常与某某些其它它属性或或者对象象的状态态有关,因因此有必必要将赋赋值操作作封装在在一个业业务规则则当中。如如果其它它对象可可以获得得该属性性的非常常量引用用(或指
8、指针),那那么对该该属性的的单纯赋赋值就会会破坏业业务规则则的完整整性。(4)流操操作符重重载返回回值申明明为“引引用”的的作用:流操作符,这这两个操操作符常常常希望望被连续续使用,例例如:ccoutt hhelllo enddl;因此这这两个操操作符的的返回值值应该是是一个仍仍然支持持这两个个操作符符的流引引用。可可选的其其它方案案包括:返回一一个流对对象和返返回一个个流对象象指针。但但是对于于返回一一个流对对象,程程序必须须重新(拷拷贝)构构造一个个新的流流对象,也也就是说说,连续续的两个个操操作符实实际上是是针对不不同对象象的!这这无法让让人接受受。对于于返回一一个流指指针则不不能连续续
9、使用操作作符。因因此,返返回一个个流对象象引用是是惟一选选择。这这个唯一一选择很很关键,它它说明了了引用的的重要性性以及无无可替代代性,也也许这就就是C+语言言中引入入引用这这个概念念的原因因吧。 赋值操操作符=。这个个操作符符象流操操作符一一样,是是可以连连续使用用的,例例如:xx = j = 100;或者者(x=10)=1000;赋赋值操作作符的返返回值必必须是一一个左值值,以便便可以被被继续赋赋值。因因此引用用成了这这个操作作符的惟惟一返回回值选择择。例3inclludee innt &putt(innt nn);iint valls110;intt errrorr=-11;vooid
10、maiin()putt(0)=100; /以pput(0)函函数值作作为左值值,等价价于vaals0=10; puut(99)=220; /以以putt(9)函数值值作为左左值,等等价于vvalss9=200; ccouttvvalss0; ccoutt=0 & n=9 ) reeturrn vvalssn; eelsee couutsuubsccrippt eerroor; reeturrn eerroor; (5)在另另外的一一些操作作符中,却却千万不不能返回回引用:+-*/ 四四则运算算符。它它们不能能返回引引用,EEffeectiive C+1的Ittem223详细细的讨论论了这个个问
11、题。主主要原因因是这四四个操作作符没有有sidde eeffeect,因因此,它它们必须须构造一一个对象象作为返返回值,可可选的方方案包括括:返回回一个对对象、返返回一个个局部变变量的引引用,返返回一个个neww分配的的对象的的引用、返返回一个个静态对对象引用用。根据据前面提提到的引引用作为为返回值值的三个个规则,第第2、33两个方方案都被被否决了了。静态态对象的的引用又又因为(a+b) = (c+d)会永远远为trrue而而导致错错误。所所以可选选的只剩剩下返回回一个对对象了。6. “引引用”与与多态的的关系?引用是除指指针外另另一个可可以产生生多态效效果的手手段。这这意味着着,一个个基类的
12、的引用可可以指向向它的派派生类实实例。例4Classs A; Cllasss B : CClasss AA.; B b; A& reff = b;7. “引引用”与与指针的的区别是是什么?指针通过某某个指针针变量指指向一个个对象后后,对它它所指向向的变量量间接操操作。程程序中使使用指针针,程序序的可读读性差;而引用用本身就就是目标标变量的的别名,对对引用的的操作就就是对目目标变量量的操作作。此外外,就是是上面提提到的对对函数传传reff和poointter的的区别。8. 什么么时候需需要“引引用”?流操作符、赋赋值操作作符=的的返回值值、拷贝贝构造函函数的参参数、赋赋值操作作符=的的参数、其其
13、它情况况都推荐荐使用引引用。以上 2-8 参参考:hhttpp:/bloog.ccsdnn.neet/wwfwdd/arrchiive/20006/005/330/77635551.asppx9. 结构构与联合合有和区区别?11. 结结构和联联合都是是由多个个不同的的数据类类型成员员组成, 但在在任何同同一时刻刻, 联联合中只只存放了了一个被被选中的的成员(所有成成员共用用一块地地址空间间), 而结构构的所有有成员都都存在(不不同成员员的存放放地址不不同)。 2. 对于联联合的不不同成员员赋值, 将会会对其它它成员重重写, 原来成成员的值值就不存存在了, 而对对于结构构的不同同成员赋赋值是互互
14、不影响响的。10. 下下面关于于“联合合”的题题目的输输出?a)inclludee unnionnintt i;chaar xx2;aa;void maiin()a.xx0 = 10; a.x11 = 1;priintff(%d,a.ii);答案:2666 (低低位低地地址,高高位高地地址,内内存占用用情况是是Ox0010AA)b) maiin() uniion /*定义一一个联合合*/ intt i; sttrucct /*在在联合中中定义一一个结构构*/ ccharr fiirstt; chhar seccondd; hallf; nnumbber; nnumbber.i=00x42241
15、; /*联联合成员员赋值*/ priintff(%c%ccn, nnumbber.hallf.ffirsst, mummberr.haalf.seccondd); nuumbeer.hhalff.fiirstt=aa; /*联合合中结构构成员赋赋值*/ nnumbber.hallf.ssecoond=b; priintff(%xnn, nummberr.i); gettch(); 答案案: AAB (00x411对应A,是低位位;Oxx42对对应BB,是是高位) 62661 (nummberr.i和和nummberr.haalf共共用一块块地址空空间)11. 已已知sttrcppy的函函数原型
16、型:chhar *sttrcppy(ccharr *sstrDDestt, cconsst ccharr *sstrSSrc)其中sstrDDestt 是目目的字符符串,sstrSSrc 是源字字符串。不不调用CC+/C 的的字符串串库函数数,请编编写函数数 sttrcppy。答案:chhar *sttrcppy(ccharr *sstrDDestt, cconsst ccharr *sstrSSrc)if ( sstrDDestt = NUULL | strrSrcc = NUULL)retturnn NUULL ;iff ( strrDesst = sstrSSrc)retturnn st
17、trDeest ;chhar *teemppptr = sstrDDestt ;wwhille( (*sstrDDestt+ = *strrSrcc+) != 0);retturnn teemppptr ;12. 已已知Sttrinng类定定义如下下:classs Sttrinngpubblicc:Sttrinng(cconsst ccharr *sstr = NNULLL); / 通用构构造函数数Strringg(coonstt Sttrinng &anootheer); / 拷贝贝构造函函数 Strringg(); / 析构构函数SStriing & ooperrateer =(coons
18、tt Sttrinng &rhss); / 赋值函函数prrivaate:chaar *m_ddataa; / 用用于保存存字符串串;尝试写出类类的成员员函数实实现。答案:Strinng:Strringg(coonstt chhar *sttr) iff ( strr = NUULL ) /sttrleen在参参数为NNULLL时会抛抛异常才才会有这这步判断断 mm_daata = nnew chaar11 ; mm_daata0 = 0 ; elsse mm_daata = nnew chaarsstrllen(strr) + 1; sstrccpy(m_ddataa,sttr); Stri
19、nng:Strringg(coonstt Sttrinng &anootheer) m_datta = neew ccharrsttrleen(aanottherr.m_datta) + 11; strrcpyy(m_datta,ootheer.mm_daata);Strinng& Strringg:ooperratoor =(coonstt Sttrinng &rhss) iif ( thhis = &rhhs) rretuurn *thhis ; ddeleete mm_daata; /删除原原来的数数据,新新开一块块内存 m_ddataa = neww chharstrrlenn(rhh
20、s.mm_daata) + 1; sttrcppy(mm_daata,rhss.m_datta); rretuurn *thhis ;Strinng:Sttrinng() deelette m_datta ;13. .h头文文件中的的ifnndeff/deefinne/eendiif 的的作用?答:防止该该头文件件被重复复引用。14. inccludde 与 i nclludee ffilee.h的区别别?答:前者是是从Sttanddardd Liibraary的的路径寻寻找和引引用fiile.h,而而后者是是从当前前工作路路径搜寻寻并引用用fille.hh。15.在CC+ 程序中中调用被被C
21、 编编译器编编译后的的函数,为为什么要要加exxterrn “CC”?首先,作为为extternn是C/C+语言中中表明函函数和全全局变量量作用范范围(可可见性)的的关键字字,该关关键字告告诉编译译器,其其声明的的函数和和变量可可以在本本模块或或其它模模块中使使用。通常,在模模块的头头文件中中对本模模块提供供给其它它模块引引用的函函数和全全局变量量以关键键字exxterrn声明明。例如如,如果果模块BB欲引用用该模块块A中定定义的全全局变量量和函数数时只需需包含模模块A的的头文件件即可。这这样,模模块B中中调用模模块A中中的函数数时,在在编译阶阶段,模模块B虽虽然找不不到该函函数,但但是并不不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 面试 大全 15327
限制150内