c语言面试大全1.docx
《c语言面试大全1.docx》由会员分享,可在线阅读,更多相关《c语言面试大全1.docx(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.求下下面函数数的返回回值(微微软)int funnc(xx) iint couuntxx = 0; whhilee(x) ccounntx +; xx = x&(x-11); rretuurn couuntxx; 假定x = 999999。 答答案:88思路:将将x转化化为2进进制,看看含有的的1的个个数。2. 什什么是“引引用”?申明和和使用“引引用”要要注意哪哪些问题题?答:引用用就是某某个目标标变量的的“别名名”(aaliaas),对对应用的的操作与与对变量量直接操操作效果果完全相相同。申申明一个个引用的的时候,切切记要对对其进行行初始化化。引用用声明完完毕后,相相当于目目标变量量名
2、有两两个名称称,即该该目标原原名称和和引用名名,不能能再把该该引用名名作为其其他变量量名的别别名。声声明一个个引用,不不是新定定义了一一个变量量,它只只表示该该引用名名是目标标变量名名的一个个别名,它它本身不不是一种种数据类类型,因因此引用用本身不不占存储储单元,系系统也不不给引用用分配存存储单元元。不能能建立数数组的引引用。3. 将将“引用用”作为为函数参参数有哪哪些特点点?(1)传传递引用用给函数数与传递递指针的的效果是是一样的的。这时时,被调调函数的的形参就就成为原原来主调调函数中中的实参参变量或或对象的的一个别别名来使使用,所所以在被被调函数数中对形形参变量量的操作作就是对对其相应应的
3、目标标对象(在在主调函函数中)的的操作。(2)使使用引用用传递函函数的参参数,在在内存中中并没有有产生实实参的副副本,它它是直接接对实参参操作;而使用用一般变变量传递递函数的的参数,当当发生函函数调用用时,需需要给形形参分配配存储单单元,形形参变量量是实参参变量的的副本;如果传传递的是是对象,还还将调用用拷贝构构造函数数。因此此,当参参数传递递的数据据较大时时,用引引用比用用一般变变量传递递参数的的效率和和所占空空间都好好。(3)使使用指针针作为函函数的参参数虽然然也能达达到与使使用引用用的效果果,但是是,在被被调函数数中同样样要给形形参分配配存储单单元,且且需要重重复使用用*指指针变量量名的
4、的形式进进行运算算,这很很容易产产生错误误且程序序的阅读读性较差差;另一一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。4. 在在什么时时候需要要使用“常常引用”?如果既要要利用引引用提高高程序的的效率,又又要保护护传递给给函数的的数据不不在函数数中被改改变,就就应使用用常引用用。常引引用声明明方式:connst 类型标标识符 &引用用名=目目标变量量名;例1int a ;connst intt &rra=aa;raa=1; /错误aa=1; /正确 例2striing fooo( );vooid barr(sttrinng & s); 那么下面面的表达达式将
5、是是非法的的:bar(fooo( );bbar(heelloo woorldd); 原因在于于fooo( )和hhelllo wworlld串串都会产产生一个个临时对对象,而而在C+中,这这些临时时对象都都是coonstt类型的的。因此此上面的的表达式式就是试试图将一一个coonstt类型的的对象转转换为非非connst类类型,这这是非法法的。引用型参参数应该该在能被被定义为为connst的的情况下下,尽量量定义为为connst 。5. 将将“引用用”作为为函数返返回值类类型的格格式、好好处和需需要遵守守的规则则?格式:类类型标识识符 &函数名名(形参参列表及及类型说说明) /函数体体 好处:
6、在在内存中中不产生生被返回回值的副副本;(注注意:正正是因为为这点原原因,所所以返回回一个局局部变量量的引用用是不可可取的。因为随随着该局局部变量量生存期期的结束束,相应应的引用用也会失失效,产产生ruuntiime errror!注意事项项:(1)不不能返回回局部变变量的引引用。这这条可以以参照EEffeectiive C+1的Ittem 31。主要原原因是局局部变量量会在函函数返回回后被销销毁,因因此被返返回的引引用就成成为了无所指指的引引用,程程序会进进入未知知状态。 (2)不不能返回回函数内内部neew分配配的内存存的引用用。这条条可以参参照Efffecctivve CC+1的的Ite
7、em 331。虽虽然不存存在局部部变量的的被动销销毁问题题,可对对于这种种情况(返返回函数数内部nnew分分配内存存的引用用),又又面临其其它尴尬尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。(3)可可以返回回类成员员的引用用,但最最好是cconsst。这这条原则则可以参参照Efffecctivve CC+1的的Iteem 330。主主要原因因是当对对象的属属性是与与某种业业务规则则(buusinnesss ruule)相相关联的的时候,其其赋值常常常与某某些其它它属性或或者对
8、象象的状态态有关,因因此有必必要将赋赋值操作作封装在在一个业业务规则则当中。如果其其它对象象可以获获得该属属性的非非常量引引用(或或指针),那那么对该该属性的的单纯赋赋值就会会破坏业业务规则则的完整整性。(4)流流操作符符重载返返回值申申明为“引引用”的的作用:流操作符符,这两个操作符常常希望被连续使用,例如:cout hello endl;因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个操作符实际上是针对不同对象的!这无法让人接受。对于返
9、回一个流指针则不能连续使用操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C+语言中引入引用这个概念的原因吧。 赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。例3inccludde iint &puut(iint n);intt vaals10;innt eerroor=-1;vvoidd maain()putt(0)=100; /以pput(0)函函数值作作为左值值,等价价
10、于vaals0=10; puut(99)=220; /以以putt(9)函数值值作为左左值,等等价于vvalss9=200; ccouttvvalss0; ccoutt=0 & n=9 ) reeturrn vvalssn; eelsee couutsuubsccrippt eerroor; reeturrn eerroor; (5)在在另外的的一些操操作符中中,却千千万不能能返回引引用:+-*/ 四则则运算符符。它们们不能返返回引用用,Efffecctivve CC+1的的Iteem233详细的的讨论了了这个问问题。主主要原因因是这四四个操作作符没有有sidde eeffeect,因因此,它
11、它们必须须构造一一个对象象作为返返回值,可可选的方方案包括括:返回回一个对对象、返返回一个个局部变变量的引引用,返返回一个个neww分配的的对象的的引用、返回一一个静态态对象引引用。根根据前面面提到的的引用作作为返回回值的三三个规则则,第22、3两两个方案案都被否否决了。静态对对象的引引用又因因为(a+bb) = (c+dd)会会永远为为truue而导导致错误误。所以以可选的的只剩下下返回一一个对象象了。6. “引引用”与与多态的的关系?引用是除除指针外外另一个个可以产产生多态态效果的的手段。这意味味着,一一个基类类的引用用可以指指向它的的派生类类实例。例4Classs AA; CClasss
12、 BB : Claass A.; BB b; A& reef = b;7. “引引用”与与指针的的区别是是什么?指针通过过某个指指针变量量指向一一个对象象后,对对它所指指向的变变量间接接操作。程序中中使用指指针,程程序的可可读性差差;而引引用本身身就是目目标变量量的别名名,对引引用的操操作就是是对目标标变量的的操作。此外,就就是上面面提到的的对函数数传reef和ppoinnterr的区别别。8. 什什么时候候需要“引引用”?流操作符符、赋值操操作符=的返回回值、拷拷贝构造造函数的的参数、赋值操操作符=的参数数、其它它情况都都推荐使使用引用用。以上 22-8 参考:htttp:/bllog.cs
13、ddn.nnet/wfwwd/aarchhivee/20006/05/30/76335511.asspx9. 结结构与联联合有和和区别?1. 结构和和联合都都是由多多个不同同的数据据类型成成员组成成, 但但在任何何同一时时刻, 联合中中只存放放了一个个被选中中的成员员(所有成成员共用用一块地地址空间间), 而结构构的所有有成员都都存在(不不同成员员的存放放地址不不同)。 2. 对于于联合的的不同成成员赋值值, 将将会对其其它成员员重写, 原来成成员的值值就不存存在了, 而对对于结构构的不同同成员赋赋值是互互不影响响的。10. 下面关关于“联联合”的的题目的的输出?a)inccludde uun
14、ioonintt i;chaar xx2;aa;voidd maain()a.xx0 = 10; a.x11 = 1;priintff(%d,a.ii);答案:2666 (低低位低地地址,高高位高地地址,内内存占用用情况是是Ox0010AA)b) maain() unnionn /*定义义一个联联合*/ innt ii; sstruuct /*在联合合中定义义一个结结构*/ chaar ffirsst; ccharr seeconnd; haalf; nummberr; nummberr.i=0x442411; /*联合成成员赋值值*/ prrinttf(%c%cnn, nummberr.ha
15、alf.firrst, muumbeer.hhalff.seeconnd); nnumbber.hallf.ffirsst=a; /*联联合中结结构成员员赋值*/ nummberr.haalf.seccondd=bb; prrinttf(%xn, nuumbeer.ii); geetchh(); 答答案: AB (0x441对应应A,是低低位;OOx422对应B,是高位位) 62261 (nuumbeer.ii和nuumbeer.hhalff共用一一块地址址空间)11. 已知sstrccpy的的函数原原型:ccharr *sstrccpy(chaar *strrDesst, connst ch
16、aar *strrSrcc)其中中strrDesst 是是目的字字符串,sstrSSrc 是源字字符串。不调用用C+/C 的字符符串库函函数,请请编写函函数 sstrccpy。答案:ccharr *sstrccpy(chaar *strrDesst, connst chaar *strrSrcc)if ( sstrDDestt = NUULL | strrSrcc = NUULL)retturnn NUULL ;iff ( strrDesst = sstrSSrc)retturnn sttrDeest ;chhar *teemppptr = sstrDDestt ;wwhille( (*sst
17、rDDestt+ = *strrSrcc+) != 0);retturnn teemppptr ;12. 已知SStriing类类定义如如下:classs SStriingpubblicc:Sttrinng(cconsst ccharr *sstr = NNULLL); / 通用构构造函数数Strringg(coonstt Sttrinng &anootheer); / 拷贝贝构造函函数 Strringg(); / 析构构函数SStriing & ooperrateer =(coonstt Sttrinng &rhss); / 赋值函函数prrivaate:chaar *m_ddataa; /
18、 用用于保存存字符串串;尝试写出出类的成成员函数数实现。答案:Striing:Sttrinng(cconsst ccharr *sstr) iff ( strr = NUULL ) /sttrleen在参参数为NNULLL时会抛抛异常才才会有这这步判断断 mm_daata = nnew chaar11 ; mm_daata0 = 0 ; elsse mm_daata = nnew chaarsstrllen(strr) + 1; sstrccpy(m_ddataa,sttr); Striing:Sttrinng(cconsst SStriing &annothher) m_datta = ne
19、ew ccharrsttrleen(aanottherr.m_datta) + 11; strrcpyy(m_datta,ootheer.mm_daata);Striing& Sttrinng:opeerattor =(cconsst SStriing &rhhs) iif ( thhis = &rhhs) rretuurn *thhis ; ddeleete mm_daata; /删除原原来的数数据,新新开一块块内存 m_ddataa = neww chharstrrlenn(rhhs.mm_daata) + 1; sttrcppy(mm_daata,rhss.m_datta); rretu
20、urn *thhis ;Striing:SStriing() deelette m_datta ;13. .h头头文件中中的iffndeef/ddefiine/enddif 的作用用?答:防止止该头文文件被重重复引用用。14. inncluude 与与 ii nccludde fille.hh的区区别?答:前者者是从SStanndarrd LLibrraryy的路径径寻找和和引用ffilee.h,而而后者是是从当前前工作路路径搜寻寻并引用用fille.hh。15.在在C+ 程序序中调用用被C 编译器器编译后后的函数数,为什什么要加加extternn “CC”?首先,作作为exxterrn是CC
21、/C+语言言中表明明函数和和全局变变量作用用范围(可可见性)的的关键字字,该关关键字告告诉编译译器,其其声明的的函数和和变量可可以在本本模块或或其它模模块中使使用。通常,在在模块的的头文件件中对本本模块提提供给其其它模块块引用的的函数和和全局变变量以关关键字eexteern声声明。例例如,如如果模块块B欲引引用该模模块A中中定义的的全局变变量和函函数时只只需包含含模块AA的头文文件即可可。这样样,模块块B中调调用模块块A中的的函数时时,在编编译阶段段,模块块B虽然然找不到到该函数数,但是是并不会会报错;它会在在连接阶阶段中从从模块AA编译生生成的目目标代码码中找到到此函数数exteern C是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 面试 大全
限制150内