C_c++语言面试宝典整理5051.docx
《C_c++语言面试宝典整理5051.docx》由会员分享,可在线阅读,更多相关《C_c++语言面试宝典整理5051.docx(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C+/C语言的标准库函数,new/delete是C+的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C+语言需要一个能完成动态内存分配和初始化工作的
2、运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。2.delete与 delete 区别?delete只会调用一次析构函数,而delete会调用每一个成员的析构函数。在MoreEffectiveC+中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operatordelete来释放内存。”delete与New配套,delete 与new 配套 MemmTesst*mmTesst1=newwMemmTesst110;MemmTesst*mmTesst2=newwMemmTesst;iint*pInnt
3、1=newwintt100; intt*pIInt22=neewinnt; delleteeppIntt1; /-1- deelettepInnt2; /-22- ddeleetemTTestt1;/-33- ddeleetemTTestt2;/-44-在-4-处处报错。这就说明:对于内建简单数据类型,delete和delete功能是相同的。对于自定义的复杂数据类型,delete和delete不能互用。delete删除一个数组,delete删除一个指针简单来说,用new分配的内存用delete删除用new分配的内存用delete删除delete会调用数组元素的析构函数。内部数据类型没有析构函数
4、,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。3.C CC+ JAVVA共同同点,不不同之处处?4.继承优优缺点。类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。更糟的是,父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。(待补充)5.C+有哪些些性质
5、(面面向对象象特点)?封装,继承和多态。在面向对象程序设计语言中,封装是利用可重用成分构造软件系统的特性,它不仅支持系统的可重用性,而且还有利于提高系统的可扩充性;消息传递可以实现发送一个通用的消息而调用不同的方法;封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。6.子类析析构时要要调用父父类的析析构函数数吗?析析构函数数调用的的次序是是先派生生类的析析构后基基类的析析构,也也就是说说在基类类的的析析构调用用的时候候,派生生类的信信息已经经全部销销毁了。定义一一个对象象时先调调用基类类的构造造函数、然然后调用用派生类类的构造造函数;析构的的时候恰恰好相反反:先调调用派生生类的析析构
6、函数数、然后后调用基基类的析析构函数数JAVVA无析析构函数数深拷贝贝和浅拷拷贝 7.多态,虚虚函数,纯纯虚函数数8.求下面面函数的的返回值值(微软软)int ffuncc(x) innt ccounntx = 00; whiile(x) coounttx +; x = xx&(xx-1); reeturrn ccounntx; 假定x = 99999。 答案:8。思路:将x转转化为22进制,看看含有的的1的个个数。9.什么是是“引用用”?申申明和使使用“引引用”要要注意哪哪些问题题?答:引用就就是某个个目标变变量的“别别名”(aliias),对引用的操操作与对对变量直直接操作作效果完完全相同
7、同。申明明一个引引用的时时候,切切记要对对其进行行初始化化。引用用声明完完毕后,相相当于目目标变量量名有两两个名称称,即该该目标原原名称和和引用名名,不能能再把该该引用名名作为其其他变量量名的别别名。声声明一个个引用,不不是新定定义了一一个变量量,它只只表示该该引用名名是目标标变量名名的一个个别名,它它本身不不是一种种数据类类型,因此引引用本身身不占存存储单元元,系统统也不给给引用分分配存储储单元。不能建立数组的引用。10.将“引引用”作作为函数数参数有有哪些特特点?(1)传递递引用给给函数与与传递指指针的效效果是一一样的。这这时,被被调函数数的形参参就成为为原来主主调函数数中的实实参变量量或
8、对象象的一个个别名来来使用,所所以在被被调函数数中对形形参变量量的操作作就是对对其相应应的目标标对象(在在主调函函数中)的的操作。(2)使用用引用传传递函数数的参数数,在内内存中并并没有产产生实参参的副本本,它是是直接对对实参操操作;而而使用一一般变量量传递函函数的参参数,当当发生函函数调用用时,需需要给形形参分配配存储单单元,形形参变量量是实参参变量的的副本;如果传传递的是是对象,还还将调用用拷贝构构造函数数。因此此,当参参数传递递的数据据较大时时,用引引用比用用一般变变量传递递参数的的效率和和所占空空间都好好。(3)使用用指针作作为函数数的参数数虽然也也能达到到与使用用引用的的效果,但但是
9、,在在被调函函数中同同样要给给形参分分配存储储单元,且且需要重重复使用用*指指针变量量名的的形式进进行运算算,这很很容易产产生错误误且程序序的阅读读性较差差;另一一方面,在在主调函函数的调调用点处处,必须须用变量量的地址址作为实实参。而而引用更更容易使使用,更更清晰。11.在什什么时候候需要使使用“常常引用”?如果既既要利用用引用提提高程序序的效率率,又要要保护传传递给函函数的数数据不在在函数中中被改变变,就应应使用常常引用。常引用用声明方方式:cconsst 类类型标识识符 &引用名名=目标标变量名名;例1intt a ;coonstt innt &ra=a;rra=11; /错误误a=11
10、; /正确确 例2strringg fooo( );vvoidd baar(sstriing & ss); 那么下面的的表达式式将是非非法的:bar(fooo( );bbar(heelloo woorldd); 原因在于ffoo( )和和heelloo woorldd串都都会产生生一个临临时对象象,而在在C+中,这这些临时时对象都都是coonstt类型的的。因此此上面的的表达式式就是试试图将一一个coonstt类型的的对象转转换为非非connst类类型,这这是非法法的。引引用型参参数应该该在能被被定义为为connst的的情况下下,尽量量定义为为connst 。12.将“引引用”作作为函数数返回
11、值值类型的的格式、好好处和需需要遵守守的规则则?格式:类型型标识符符 &函函数名(形形参列表表及类型型说明) /函数体体 好处:在内内存中不不产生被被返回值值的副本本;(注注意:正正是因为为这点原原因,所所以返回回一个局局部变量量的引用用是不可可取的。因因为随着着该局部部变量生生存期的的结束,相相应的引引用也会会失效,产产生ruuntiime errror!注意事事项:(1)不能能返回局局部变量量的引用用。这条条可以参参照Efffecctivve CC+1的的Iteem 331。主主要原因因是局部部变量会会在函数数返回后后被销毁毁,因此此被返回回的引用用就成为为了无无所指的引用用,程序序会进入
12、入未知状状态。 (2)不能能返回函函数内部部neww分配的的内存的的引用。这这条可以以参照EEffeectiive C+1的Ittem 31。虽虽然不存存在局部部变量的的被动销销毁问题题,可对对于这种种情况(返返回函数数内部nnew分分配内存存的引用用),又又面临其其它尴尬尬局面。例例如,被被函数返返回的引引用只是是作为一一个临时时变量出出现,而而没有被被赋予一一个实际际的变量量,那么么这个引引用所指指向的空空间(由由neww分配)就就无法释释放,造造成meemorry lleakk。(3)可以以返回类类成员的的引用,但但最好是是connst。这这条原则则可以参参照Efffecctivve C
13、C+1的的Iteem 330。主主要原因因是当对对象的属属性是与与某种业业务规则则(buusinnesss ruule)相相关联的的时候,其其赋值常常常与某某些其它它属性或或者对象象的状态态有关,因因此有必必要将赋赋值操作作封装在在一个业业务规则则当中。如如果其它它对象可可以获得得该属性性的非常常量引用用(或指指针),那那么对该该属性的的单纯赋赋值就会会破坏业业务规则则的完整整性。(4)流操操作符重重载返回回值申明明为“引引用”的的作用:流操作作符,这两两个操作作符常常常希望被被连续使使用,例例如:ccoutt hhelllo enddl;因此这这两个操操作符的的返回值值应该是是一个仍仍然支持
14、持这两个个操作符符的流引引用。可可选的其其它方案案包括:返回一一个流对对象和返返回一个个流对象象指针。但但是对于于返回一一个流对对象,程程序必须须重新(拷拷贝)构构造一个个新的流流对象,也也就是说说,连续续的两个个操操作符实实际上是是针对不不同对象象的!这这无法让让人接受受。对于于返回一一个流指指针则不不能连续续使用操作作符。因因此,返返回一个个流对象象引用是是惟一选选择。这这个唯一一选择很很关键,它它说明了了引用的的重要性性以及无无可替代代性,也也许这就就是C+语言言中引入入引用这这个概念念的原因因吧。 赋值操操作符=。这个个操作符符象流操操作符一一样,是是可以连连续使用用的,例例如:xx
15、= j = 100;或者者(x=10)=1000;赋赋值操作作符的返返回值必必须是一一个左值值,以便便可以被被继续赋赋值。因因此引用用成了这这个操作作符的惟惟一返回回值选择择。例3i nccludde iint &puut(iint n);intt vaals10;innt eerroor=-1;vvoidd maain()putt(0)=100; /以pput(0)函函数值作作为左值值,等价价于vaals0=10; puut(99)=220; /以以putt(9)函数值值作为左左值,等等价于vvalss9=200; ccouttvvalss0; ccoutt=0 & n=9 ) reetur
16、rn vvalssn; eelsee couutsuubsccrippt eerroor; reeturrn eerroor; (5)在另另外的一一些操作作符中,却却千万不不能返回回引用:+-*/ 四四则运算算符。它它们不能能返回引引用,EEffeectiive C+1的Ittem223详细细的讨论论了这个个问题。主主要原因因是这四四个操作作符没有有sidde eeffeect,因因此,它它们必须须构造一一个对象象作为返返回值,可可选的方方案包括括:返回回一个对对象、返返回一个个局部变变量的引引用,返返回一个个neww分配的的对象的的引用、返返回一个个静态对对象引用用。根据据前面提提到的引引用
17、作为为返回值值的三个个规则,第第2、33两个方方案都被被否决了了。静态态对象的的引用又又因为(a+b) = (c+d)会永远远为trrue而而导致错错误。所所以可选选的只剩剩下返回回一个对对象了。13.“引引用”与与多态的的关系?引用是是除指针针外另一一个可以以产生多多态效果果的手段段。这意意味着,一个基类的引用可以指向它的派生类实例。例4Class A; Class B : Class A.; B b; A& ref = b;14.“引引用”与与指针的的区别是是什么?1) 引用必必须被初初始化,指指针不必必。 22) 引引用初始始化以后后不能被被改变,指指针可以以改变所所指的对对象。 2)
18、不存在在指向空空值的引引用,但但是存在在指向空空值的指指针。指指针通过过某个指指针变量量指向一一个对象象后,对对它所指指向的变变量间接接操作。程程序中使使用指针针,程序序的可读读性差;而引用用本身就就是目标标变量的的别名,对引用的操作就是对目标变量的操作。此外,就是上面提到的对函数传ref和pointer的区别。15.什么么时候需需要“引引用”?流操作作符、赋值值操作符符=的返返回值、拷拷贝构造造函数的的参数、赋赋值操作作符=的的参数、其其它情况况都推荐荐使用引引用。以以上 22-8 参考:htttp:/deevellop.csaai.ccn/cc/NOO000000221.hhtm16.结构
19、构与联合合有和区区别?(1). 结构构和联合合都是由由多个不不同的数数据类型型成员组组成, 但在任任何同一一时刻, 联合合中只存存放了一一个被选选中的成成员(所所有成员员共用一一块地址址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。(2).对于联合的不同成员赋值, 将会对其它成员重写,原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。17.面关关于“联联合”的的题目的的输出?a)i nclludee unnionnintt i;chaar xx2;aa;voidmaiin()a.xx0 = 10; a.x11 = 1;priintff(%d,a.ii);答案:266
20、6 (低低位低地地址,高高位高地地址,内内存占用用情况是是Ox0010AA)b)maiin() uniion /*定义一一个联合合*/ intt i; sttrucct /*在在联合中中定义一一个结构构*/ ccharr fiirstt; chhar seccondd; hallf; nnumbber; nnumbber.i=00x42241; /*联联合成员员赋值*/ priintff(%c%ccn, nuumbeer.hhalff.fiirstt, mmumbber.hallf.ssecoond); nummberr.haalf.firrst=a; /*联合中中结构成成员赋值值*/ nuu
21、mbeer.hhalff.seeconnd=b; pprinntf(%xxn, nuumbeer.ii); geetchh(); 答答案: AB (0x441对应应A,是低低位;OOx422对应B,是高位位)662611 (nnumbber.i和nnumbber.hallf共用用一块地地址空间间)18.关联联、聚合合(Agggreegattionn)以及及组合(Commpossitiion)的区别别?涉及到UMML中的的一些概概念:关关联是表表示两个个类的一一般性联联系,比比如“学学生”和和“老师师”就是是一种关关联关系系;聚合合表示hhas-a的关关系,是是一种相相对松散散的关系系,聚合合类
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C_c 语言 面试 宝典 整理 5051
限制150内