c语言面试大全112119.docx
《c语言面试大全112119.docx》由会员分享,可在线阅读,更多相关《c语言面试大全112119.docx(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.求下面函数的返回值(微软)int ffunc(x) intt couuntx = 0; whiile(xx) coountxx +; xx = xx&(x-1); rreturrn coountxx; 假定x = 99999。 答答案:8思路:将xx转化为22进制,看看含有的11的个数。2. 什么么是“引用用”?申明明和使用“引引用”要注注意哪些问问题?答:引用就就是某个目目标变量的的“别名”(aaliass),对应应用的操作作与对变量量直接操作作效果完全全相同。申申明一个引引用的时候候,切记要要对其进行行初始化。引引用声明完完毕后,相相当于目标标变量名有有两个名称称,即该目目标原名称称和
2、引用名名,不能再再把该引用用名作为其其他变量名名的别名。声声明一个引引用,不是是新定义了了一个变量量,它只表表示该引用用名是目标标变量名的的一个别名名,它本身身不是一种种数据类型型,因此引引用本身不不占存储单单元,系统统也不给引引用分配存存储单元。不不能建立数数组的引用用。3. 将“引引用”作为为函数参数数有哪些特特点?(1)传递递引用给函函数与传递递指针的效效果是一样样的。这时时,被调函函数的形参参就成为原原来主调函函数中的实实参变量或或对象的一一个别名来来使用,所所以在被调调函数中对对形参变量量的操作就就是对其相相应的目标标对象(在在主调函数数中)的操操作。(2)使用用引用传递递函数的参参
3、数,在内内存中并没没有产生实实参的副本本,它是直直接对实参参操作;而而使用一般般变量传递递函数的参参数,当发发生函数调调用时,需需要给形参参分配存储储单元,形形参变量是是实参变量量的副本;如果传递递的是对象象,还将调调用拷贝构构造函数。因因此,当参参数传递的的数据较大大时,用引引用比用一一般变量传传递参数的的效率和所所占空间都都好。(3)使用用指针作为为函数的参参数虽然也也能达到与与使用引用用的效果,但但是,在被被调函数中中同样要给给形参分配配存储单元元,且需要要重复使用用*指针针变量名的形式进进行运算,这这很容易产产生错误且且程序的阅阅读性较差差;另一方方面,在主主调函数的的调用点处处,必须
4、用用变量的地地址作为实实参。而引引用更容易易使用,更更清晰。4. 在什什么时候需需要使用“常常引用”?如果既要利利用引用提提高程序的的效率,又又要保护传传递给函数数的数据不不在函数中中被改变,就就应使用常常引用。常常引用声明明方式:cconstt 类型标标识符 &引用名=目标变量量名;例1int aa ;coonst int &ra=a;raa=1; /错误误a=1; /正正确 例2strinng fooo( );voiid baar(sttringg & ss); 那么下面的的表达式将将是非法的的:bar(ffoo( );bbar(helllo woorld); 原因在于ffoo( )和hh
5、elloo worrld串串都会产生生一个临时时对象,而而在C+中,这些些临时对象象都是coonst类类型的。因因此上面的的表达式就就是试图将将一个coonst类类型的对象象转换为非非consst类型,这这是非法的的。引用型参数数应该在能能被定义为为consst的情况况下,尽量量定义为cconstt 。5. 将“引引用”作为为函数返回回值类型的的格式、好好处和需要要遵守的规规则?格式:类型型标识符 &函数名名(形参列列表及类型型说明) /函函数体 好处:在内内存中不产产生被返回回值的副本本;(注意意:正是因因为这点原原因,所以以返回一个个局部变量量的引用是是不可取的的。因为随随着该局部部变量生
6、存存期的结束束,相应的的引用也会会失效,产产生runntimee errror!注意事项:(1)不能能返回局部部变量的引引用。这条条可以参照照Effeectivve C+1的Iteem 311。主要原原因是局部部变量会在在函数返回回后被销毁毁,因此被被返回的引引用就成为为了无所所指的引引用,程序序会进入未未知状态。 (2)不能能返回函数数内部neew分配的的内存的引引用。这条条可以参照照Effeectivve C+1的Iteem 311。虽然不不存在局部部变量的被被动销毁问问题,可对对于这种情情况(返回回函数内部部new分分配内存的的引用),又又面临其它它尴尬局面面。例如,被函数返回的引用只是
7、作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。(3)可以以返回类成成员的引用用,但最好好是connst。这这条原则可可以参照EEffecctivee C+1的的Itemm 30。主主要原因是是当对象的的属性是与与某种业务务规则(bbusinness rulee)相关联联的时候,其其赋值常常常与某些其其它属性或或者对象的的状态有关关,因此有有必要将赋赋值操作封封装在一个个业务规则则当中。如如果其它对对象可以获获得该属性性的非常量量引用(或或指针),那那么对该属属性的单纯纯赋值就会会破坏业务务规则的完完整性。(4)
8、流操操作符重载载返回值申申明为“引引用”的作作用:流操作符,这两个个操作符常常常希望被被连续使用用,例如:coutt helllo eendl;因此这这两个操作作符的返回回值应该是是一个仍然然支持这两两个操作符符的流引用用。可选的的其它方案案包括:返返回一个流流对象和返返回一个流流对象指针针。但是对对于返回一一个流对象象,程序必必须重新(拷拷贝)构造造一个新的的流对象,也也就是说,连连续的两个个操作作符实际上上是针对不不同对象的的!这无法法让人接受受。对于返返回一个流流指针则不不能连续使使用操操作符。因因此,返回回一个流对对象引用是是惟一选择择。这个唯唯一选择很很关键,它它说明了引引用的重要要
9、性以及无无可替代性性,也许这这就是C+语言中中引入引用用这个概念念的原因吧吧。 赋值值操作符=。这个操操作符象流流操作符一一样,是可可以连续使使用的,例例如:x = j = 100;或者(x=100)=1000;赋值值操作符的的返回值必必须是一个个左值,以以便可以被被继续赋值值。因此引引用成了这这个操作符符的惟一返返回值选择择。例3incllude int &putt(intt n);int valss10;intt errror=-1;vooid mmain()put(0)=110; /以puut(0)函数值作作为左值,等等价于vaals00=100; putt(9)=20; /以pput(
10、99)函数值值作为左值值,等价于于valss9=20; couttvaals00; ccout=00 & n=99 ) rreturrn vaalsnn; eelse cooutsubbscriipt eerrorr; rreturrn errror; (5)在另另外的一些些操作符中中,却千万万不能返回回引用:+-*/ 四则运算算符。它们们不能返回回引用,EEffecctivee C+1的的Itemm23详细细的讨论了了这个问题题。主要原原因是这四四个操作符符没有siide eeffecct,因此此,它们必必须构造一一个对象作作为返回值值,可选的的方案包括括:返回一一个对象、返返回一个局局部变
11、量的的引用,返返回一个nnew分配配的对象的的引用、返返回一个静静态对象引引用。根据据前面提到到的引用作作为返回值值的三个规规则,第22、3两个个方案都被被否决了。静静态对象的的引用又因因为(aa+b) = (c+d)会永远远为truue而导致致错误。所所以可选的的只剩下返返回一个对对象了。6. “引引用”与多多态的关系系?引用是除指指针外另一一个可以产产生多态效效果的手段段。这意味味着,一个个基类的引引用可以指指向它的派派生类实例例。例4Classs A; Classs B : Cllass A.; B b; A& ref = b;7. “引引用”与指指针的区别别是什么?指针通过某某个指针变
12、变量指向一一个对象后后,对它所所指向的变变量间接操操作。程序序中使用指指针,程序序的可读性性差;而引引用本身就就是目标变变量的别名名,对引用用的操作就就是对目标标变量的操操作。此外外,就是上上面提到的的对函数传传ref和和poinnter的的区别。8. 什么么时候需要要“引用”?流操作符、赋值操操作符=的的返回值、拷拷贝构造函函数的参数数、赋值操操作符=的的参数、其其它情况都都推荐使用用引用。以上 2-8 参考考:htttp:/blogg.csddn.neet/wffwd/aarchiive/22006/05/330/76635511.asppx9. 结构构与联合有有和区别?1. 结结构和联合
13、合都是由多多个不同的的数据类型型成员组成成, 但在在任何同一一时刻, 联合中只只存放了一一个被选中中的成员(所有成员员共用一块块地址空间间), 而结结构的所有有成员都存存在(不同同成员的存存放地址不不同)。 2. 对对于联合的的不同成员员赋值, 将会对其其它成员重重写, 原原来成员的的值就不存存在了, 而对于结结构的不同同成员赋值值是互不影影响的。10. 下下面关于“联联合”的题题目的输出出?a)incllude uniionint i;chhar xx2;a;void mainn()a.x0 = 10; a.xx1 = 1;prinntf(%d,a.i);答案:2266 (低位低地地址,高位
14、位高地址,内内存占用情情况是Oxx010AA)b) mainn() unioon /*定定义一个联联合*/ iint ii; strruct /*在在联合中定定义一个结结构*/ charr firrst; charr seccond; hallf; nuumberr; numbber.ii=0x44241; /*联联合成员赋赋值*/ prrintff(%cc%cnn, nnumbeer.haalf.ffirstt, muumberr.hallf.seecondd); nummber.halff.firrst=a; /*联合中结结构成员赋赋值*/ nuumberr.hallf.seecondd=
15、b; prinntf(%xnn, nnumbeer.i); getcch(); 答案: AB (0xx41对应应A,是低位;Ox422对应BB,是高高位) 66261 (nummber.i和nuumberr.hallf共用一一块地址空空间)11. 已已知strrcpy的的函数原型型:chaar *sstrcppy(chhar *strDDest, connst cchar *strrSrc)其中sttrDesst 是目目的字符串串,strrSrc 是源字符符串。不调调用C+/C 的的字符串库库函数,请请编写函数数 strrcpy。答案:chhar *strccpy(cchar *strrDes
16、tt, coonst charr *sttrSrcc)if ( strrDestt = NULLL | strSSrc = NUULL)rreturrn NUULL ;if ( strrDestt = strSSrc)rreturrn sttrDesst ;cchar *temmpptrr = sstrDeest ;whille( (*strrDestt+ = *sttrSrcc+) != 0);retuurn ttemppptr ;12. 已已知Strring类类定义如下下:classs Strringpubllic:SStrinng(coonst charr *sttr = NULLL);
17、 / 通用用构造函数数Striing(cconstt Strring &anootherr); / 拷贝贝构造函数数 Sttringg(); / 析析构函数SStrinng & operraterr =(cconstt Strring &rhss); / 赋值值函数prrivatte:chhar *m_daata; / 用用于保存字字符串;尝试写出类类的成员函函数实现。答案:Strinng:SStrinng(coonst charr *sttr) if ( strr = NULLL ) /strrlen在在参数为NNULL时时会抛异常常才会有这这步判断 m_ddata = neew chhar
18、11 ; mm_datta0 = 0 ; eelse m_daata = neww chaarsttrlenn(strr) + 1; sttrcpyy(m_ddata,str); Strinng:SStrinng(coonst Striing &anotther) m_daata = neww chaarsttrlenn(anootherr.m_ddata) + 11; sttrcpyy(m_ddata,otheer.m_dataa);Strinng& SStrinng:ooperaator =(coonst Striing &rhs) if ( thhis = &rrhs) retuurn
19、*thiss ; deeletee mm_datta; /删除原原来的数据据,新开一一块内存 mm_datta = new charrstrrlen(rhs.m_daata) + 1; strrcpy(m_daata,rrhs.mm_datta); retuurn *thiss ;Strinng:Striing() deleete m_ddata ;13. .h头文件件中的iffndeff/deffine/endiif 的作作用?答:防止该该头文件被被重复引用用。14. incllude 与 ii ncllude fille.h的区别?答:前者是是从Staandarrd Liibrarry的路
20、径径寻找和引引用fille.h,而而后者是从从当前工作作路径搜寻寻并引用ffile.h。15.在CC+ 程程序中调用用被C 编编译器编译译后的函数数,为什么么要加exxternn “C”?首先,作为为exteern是CC/C+语言中表表明函数和和全局变量量作用范围围(可见性性)的关键键字,该关关键字告诉诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模模块的头文文件中对本本模块提供供给其它模模块引用的的函数和全全局变量以以关键字eexterrn声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段
21、,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数exterrn CC是连接接申明(llinkaage ddeclaaratiion),被exttern C修修饰的变量量和函数是是按照C语语言方式编编译和连接接的,来看看看C+中对类似似C的函数数是怎样编编译的:作作为一种面面向对象的的语言,CC+支持持函数重载载,而过程程式语言CC则不支持持。函数被被C+编编译后在符符号库中的的名字与CC语言的不不同。例如如,假设某某个函数的的原型为: void foo( intt x, int y );该函数被CC编译器编编译后在符符号库中的的名字为_foo,而
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 面试 大全 112119
限制150内