游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

关于面向对象的面试知识点整理(一)

  例1:C中的空类默认产生哪些类成员函数?
  对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。
  例2:structure是否可以拥有constructordestructor及成员函数?如果可以,那么structure和class还有区别么?
  区别是class中变量默认是private,struct中的变量默认是public。struct可以有构造函数,析构函数,之间也可以继承,等等。C中的struct其实和class意义一样,唯一不同的就是struct里面默认的访问控制是public,class中默认的访问控制是private。C中存在struct关键字的唯一意义就是为了让C程序员们有个归属感,是为了让C编译器兼容以前用C开发的项目。
  例3:现有以下代码,则编译时会产生错误的是?structTest{Test(int){}Test(){}Test(){}voidfun(){}};intmain(){Testa(1);a。fun();Testb();b。fun();return0;}
  Testb()这个语法等同于声明了一个函数,函数名为b,返回值为Test,传入参数为空。但是实际上,代码作者是希望声明一个类型为Test,变量名为b的变量,应该写成Testb;,但程序中这个错误在编译时是检测不出来的。出错的是b。fun(),它是编译不过去的。
  例4:下面程序的打印出的结果是什么?includeiostreamusingnamespacestd;classBase{public:Base(inti):mj(i),mi(mj){}Base():mj(0),mi(mj){}Base(){}intgeti()const{returnmi;}intgetj()const{returnmj;}private:intmi;intmj;};intmain(){Baseobj(98);coutobj。geti()endl;coutobj。getj()endl;return0;}
  本题想要得到的结果是98,98。但是成员变量的声明是先mi,然后是mj;初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的,因此mi会被赋予一个随机值。更改一下成员变量的声明顺序可以得到预想的结果。如果要得到98,98的输出结果,程序需要修改如下intmj;intmi;
  补充变量未初始化的值未初始化的全局数组为0;未初始化的局部数组为随机值;初始化部分的全局数组与局部数组,初始化部分为初始化值,未初始化部分都为0;(不管全局还是局部)全局变量未初始化:includeiostreamusingnamespacestd;inti;charc;floatf;doubled;intp;intmain(){coutiendl;0coutcendl;coutfendl;0coutdendl;0coutpendl;0return0;}局部变量未初始化为随机数。includeiostreamusingnamespacestd;intmain(){inti;charc;floatf;doubled;intp;coutiendl;coutcendl;coutfendl;coutdendl;coutpendl;return0;}类的成员变量为初始化的值对象在全局作用域或为静态局部对象时,类的内置成员变量被初始化为0。对象在局部作用域定义时,类的内置成员变量不被初始化为0。对于类型成员按照其自身的默认构造函数进行初始化。如果类显式提供了带参数的构造函数,则编译器不会再为其生成空参数的构造函数。这时候就不能用空参数来定义类型变量classA{public:intvalue;A(inti):value(i){}};intmain(){Aa;errorreturn0;}
  参考代码:includeiostreamusingnamespacestd;classA{public:inti;floatf;doubled;charc;intp;voidprint(){coutiendl;coutcendl;coutfendl;coutdendl;coutpendl;coutendl;}};Aa0;intmain(){a0。print();Aa;a。print();return0;}
  例5:MFC类库中,CObject类的重要性不言自明。在CObject的定义中,我们看到一个有趣的现象,即CObject的析构函数是虚拟的。为什么MFC的编写者认为虚拟的析构函数是必要的?includeiostreamusingnamespacestd;classBase{public:Base(){coutBaseendl;}Base(){coutBaseendl;}};classDerived:publicBase{public:Derived(){coutDerivedendl;}Derived(){coutDerivedendl;}};intmain(){BasebnewDerived();deleteb;return0;}
  我们将一个父类的指针指向子类的对象,当我们使用deleteb去释放b指向的内存,会调用父类的析构函数(静态联编),但是却不会调用子类的析构函数。
  如果子类对象在构造函数内申请了一块堆内存,最后根据上述情况则会造成内存泄漏,我们在Base(){coutBaseendl;}前加上virtual,deleteb会先调用子类析构,再调用父类析构,自然就把子类申请的内存释放掉啦!
  补充知识:C静态联编和动态联编
  根据:https:blog。csdn。neterlian1992articledetails44262843所修改
  联编是指一个程序自身彼此关联的一个过程。按照联编所进行的阶段不同,可分为静态联编和动态联编两种。
  静态联编:静态联编是指在程序编译链接阶段进行联编。这种联编又称为早期联编,这是因为这种联编工作是在程序运行之前完成的。
  编译时所进行的联编又称为静态束定。束定是指确定所调用的函数与执行该函数代码之间的关系。其优点是效率高,但灵活性差。
  下面来看一个静态联编的程序例题:includeiostreamusingnamespacestd;classPoint{public:Point(doublei,doublej)基类的构造函数{xi;yj;}doubleArea()const定义的常成员函数{return0。0;}private:doublex,y;};classRectangle:publicPoint公有继承的派生类{public:Rectangle(doublei,doublej,doublek,doublel);声明派生类的构造函数doubleArea()const{returnwh;}private:doublew,h;};Rectangle::Rectangle(doublei,doublej,doublek,doublel):Point(i,j)派生类构造函数的函数体{wk;hl;}voidfun(Points)定义的类外函数{couts。Area()endl;}intmain(){Rectanglerec(3。5,15。2,5。0,28。0);定义的派生类的带参数的对象fun(rec);调用函数fun()}
  输出的结果为:0
  程序分析:从输出的结果来看,该程序执行了Point::Area()的结果。派生类Rectangle的对象rec作为函数fun()的实参,而该函数的形参是类Point()的对象的引用s。在程序编译阶段,对象引用s所执行的Area()操作被联编到Point类的函数上。因此在执行函数fun()中的s。Area()操作时,返回值为0。
  通过对象指针进行的普通成员函数的调用,仅仅与指针的类型有关,而与此刻指针正指向什么对象无关。要想实现当指针指向不同对象时执行不同的操作,就必须将基类中相应的成员函数定义为虚函数,进行动态联编。
  动态联编
  动态联编是指在程序运行时进行的联编,这种联编又称为晚期联编。动态联编的优点是灵活性强,但效率低。
  动态联编要求在运行时解决程序中的函数调用与执行该函数代码间的关系,又称为动态束定。在上述的例题中,由于是静态联编,函数fun()中的参数s所引用的对象被联编到类Point上。那么实行动态联编,则s所引用的对象将被联编到类Rectangle上。由此可见,对于同一个对象的引用,采用不同的联编方式将会被联编到不同类的对象上,即不同联编可以选择不同的实现,这便是多态性。实际上是对于函数fun()的参数的多态性选择。联编是一种重要的多态性选择。
  实现动态联编需要同时满足以下三个条件:必须把动态联编的行为定义为类的虚函数。类之间应满足子类型关系,通常表现为一个类从另一个类公有派生而来。必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。
  上述的例题可以改为:includeiostreamusingnamespacestd;classPoint{public:Point(doublei,doublej)基类的构造函数{xi;yj;}virtualdoubleArea()const定义的虚函数{return0。0;}private:doublex,y;};classRectangle:publicPoint公有继承的派生类{public:Rectangle(doublei,doublej,doublek,doublel);声明派生类的构造函数virtualdoubleArea()const派生类的虚函数{returnwh;}private:doublew,h;};Rectangle::Rectangle(doublei,doublej,doublek,doublel):Point(i,j)派生类构造函数的函数体{wk;hl;}voidfun(Points)定义的类外函数{couts。Area()endl;}intmain(){Rectanglerec(3。5,15。2,5。0,28。0);定义的派生类的带参数的对象fun(rec);调用函数fun()}
  输出的结果为:140。
  程序分析:该程序中说明了虚函数,fun()函数的对象引用参数s被动态联编,该函数体内调用的Area()函数是在运行中确定的,而不是在编译时确定的,因此在运行时,实参rec为类rectangle的对象,于是Area()函数被确定为类Rectangle的Area()函数。
  例6:析构函数可以为virtual型,构造函数则不能。那么为什么构造函数不能为虚呢?
  虚函数采用一种虚调用的办法。虚调用是一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但是如果要创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为虚。
  例7:如果虚函数是非常有效的,我们是否可以把每个函数都声明为虚函数?
  不行,这是因为虚函数是有代价的:由于每个虚函数的对象都必须维护一个虚表,因此在使用虚函数的时候都会产生个系统开销。如果仅是个很小的类,且不想派生其他
  类,那么根本没必要使用虚函数。
  例8:析构函数可以是内联函数吗?
  析构函数可以是内联函数。
  例9:重载和覆盖有什么不同?
  override是指派生类重写基类的虚函数,overload约定成俗地被翻译为重载,是指编写一个与已有函数同名,但是参数表不同的函数。例如一个函数既可以接收整型数作为参数,也可以接收浮点数作为参数。重载不是一种面向对象的编程,而只是一种语法规则,重载与多态没有什么直接关系。
  例10:在C中,你不应该从以下哪个抛出异常?A。Constructor(构造函数)B。Destructor(析构函数)C。Virtualfunction(虚方法)D。Noneoftheabove(以上答案都不对)
  构造函数中抛出异常是有一定必要的,试想如下情况:
  构造函数中有两次new操作,第一次成功了,返回了有效的内存,而第二次失败,此时因为对象构造尚未完成,析构函数是不会调用的,也就是delete语句没有被执行,第一次new出的内存就悬在那儿了(发生内存泄露),所以异常处理程序可以将其暴露出来。
  构造函数中遇到异常是不会调用析构函数的,一个对象的父对象的构造函数执行完毕,不能称之为构造完成,对象构造是不可分割的,要么完全成功,要么完全失败,C保证这一点。对于成员变量,C遵循这样的规则,即会从异常的发生点按照成员变量的初始化的逆序释放成员。举例来说,有如下初始化列表:A::A():ml(),m2(),m3(),m4(),m5()(){};
  假定m3的初始化过程中抛出异常,则会按照m2,ml的顺序调用这两个成员的析构函数。在{}之间发生的未捕捉异常,最终会导致在栈的开解时析构所有的数据成员。
  处理这样的问题,使用智能指针是最好的,这是因为autoptr成员是一个对象而不是指针。换句话说,只要不使用原始的指针,那么就不必担心构造函数抛出异常而导致资源泄露。
  所以在C中,资源泄露的问题一般都用RAII(资源获取即初始化)的办法:把需要打开关闭的资源用简单的对象封装起来(这种封装可以同时有多种用处,比如隐藏底层API细节,以利于移植)。这可以省去很多的麻烦。
  如果不用RAII,即使当前构造函数里获取的东西在析构函数里都释放了,如果某天对类有改动,要新增加一种资源,构造函数里一般能适当地获取,但记不记得要在析构函数里相应地释放呢?失误的比例很大。如果考虑到构造函数里抛出异常,就更复杂了。随着项目的不断扩大和时间的推移,这些细节不可能都记得住,而且,有可能会由别人来实施这样的改动。C中通知对象构造失败的唯一方法,就是在构造函数抛出异常当对象发生部分构造异常时,已经构造完毕的子对象将会逆序地被析构(即异常发生点前面的对象;而还没有开始构建的子对象将不会被构造了(即异常发生点后面的对象,当然它也就没有析构过程了;还有正在构建的子对象和对象自己本身将停止继续构建(即出现异常的对象),并且它的析构是不会被执行的。
  析构函数抛异常
  EffectiveC建议,析构函数尽可能地不要抛出异常。设想如果对象出了异常,现在异常处理模块为了维护系统对象数据的一致性,避免资源泄漏,有责任释放这个对象的资源,调用对象的析构函数,可现在假如析构过程又再出现异常,那么请问由谁来保证这个对象的资源释放呢?而且这新出现的异常又由谁来处理呢?不要忘记前面的一个异常目前都还没有处理结束,因此陷入了一个矛盾之中,或者说处于无限的递归嵌套之中。所以C标准就做出了这种假设。

麦亨利超新星热血满格排兵布阵开启拔河策略战星关系11月23日讯近日,英皇娱乐艺人麦亨利(Henry)加盟的体育类综艺《超新星全运会》正式收官。在节目中,麦亨利用努力与实力带领大家共同见证竞技强者的诞生之路。在最后……浙江卫视倾城时光金瀚喜欢赵丽颖山河可鉴星关系11月23日讯由赵丽颖、金瀚、俞灏明、曹曦文、孟瑞、林源、张峻宁、刘凡菲领衔主演,周一围、刘恺威友情出演的都市轻商甜宠剧《你和我的倾城时光》正在浙江卫视中国蓝剧场火热播出……刘美旗出席穿甲弹发布会搭档程枫演绎战地爱情星关系11月23日由北京长江文化、海宁红橙传媒联合出品的青春热血战争剧《穿甲弹》在江苏南京举行开播发布会,程枫、曲尼次仁、刘美旗、封佳奇等主演悉数出席。与时代抗争化身军事……被超市按30斤卖,收购价却是1元,我国产量全球第一,出口仅占这两年,我国坚果市场一路飞涨,洽洽食品、三只松鼠、百草味、良品铺子可以说合力制造出了一个坚果的零食市场,很多年轻人都会购买坚果零食放在办公室或者家里,因为在他们看来,坚果是营养……吴倩盛唐幻夜爆笑选宫女新剧蓄力开启劳模模式星关系11月23日讯由周晓鹏执导,缪娟编剧,吴倩、郑业成等实力演员主演的古装悬疑探案剧《盛唐幻夜》正在火热播出中。剧中,吴倩饰演的叶远安为追回天珠而深入娑罗国,在娑罗国的种种经……鞠婧祎首挑综艺大梁古风佳人领衔国风美少年星关系11月23日讯由鞠婧祎、霍尊、张云雷担当国风召集人,由爱奇艺推出的全新国风文化创新推广演唱秀《国风美少年》将于今日上线。少年因国风而美,国风因少年而新,《国风美少年……人不彪悍枉少年热播另类班长侯明昊有够彪星关系11月23日讯由企鹅影视、耀客传媒联合出品,邓科执导,侯明昊、万鹏、张耀等主演的青春校园剧《人不彪悍枉少年》于昨晚在腾讯视频播出。该剧讲述了热血少年花彪和飞车五人组成员,……小米手表第四次OTA升级新增多项功能与百款表盘作为小米首款智能手表产品小米手表自去年双十一发布即成为史上最畅销的WearOS手表,仅去年双十一单日销售额破亿,有业内人士表示小米手表一天的销量是过去所有安卓手表一年的销量。……三大运营商,都用了哪些频谱?这直接决定了你的网速!众所周知,在移动通信中,频谱是最宝贵的资源,非常稀缺。频谱资源的管理和良好利用,是各大运营商的头等大事。国内三大运营商到底给2G,3G,4G和5G使用了哪些频谱,分配了多……台电T20平板,手游臻品,竞技首选开学季福利,4G全网通上网平板、X27十核处理器、高速内存、2。5K夏普高清屏、指纹感应等等,国产平板越来越认真,这是史上最接近苹果的一款国产平板,然而价格却半价。手游臻……我们的四十年曝光雨中剧照以身作则践行改革时代精神星关系11月22日讯由王锦担任制片人,王梓执导,庸人编剧,金世佳、柴碧云、李茂、徐小飒、谢芳、钱波、刘亚津、苏国涛、柴鸥、王伟华、馨子、梁佳伟、卢佳、徐薏雯等主演的致敬改革开放……TIOBE9月编程语言排行榜出炉!这个语言或成最大赢家01hrTIOBE九月编程语言TOP20出炉TIOBE九月编程语言出炉!Python从未如此接近TIOBE指数的第一名位置。它只需要再涨0。16就能超越C语言了。……
郭台铭计划为台湾采购500万剂BioNTech新冠疫苗路透社5月29日报道,富士康创始人郭台铭表示,鉴于日趋严重的新冠疫情,他的慈善机构计划申请500万剂BioNTech新冠疫苗到台湾地区。报道称,郭在一份声明中表示,他的永……雷军小米Civi是今年续航最出色的小米手机9月25日消息,小米创始人雷军在其个人微博发文称,小米Civi在同档潮流手机中,最轻、最薄,机身宽度最小,依然内置了4500mAh电池,还有双扬声器、NFC、红外遥控。雷军称,……抖音14岁以下实名用户已全部进入青少年模式据抖音微信公众号消息,为进一步加大青少年保护力度,六一前,抖音宣布了将实施平台史上最严格的青少年保护措施,14岁以下实名认证用户将直接进入青少年模式,且无法自行退出。最近……颜值与实力并存,A。O。史密斯佳尼特零冷水燃气热水器体验时间过得很快,不经意间已悄然入秋!室外的温度也已逐渐下降,让我们对热水的需求也逐渐增加。入秋后入冬也就不远了,对热水的需求更不用多说,能有热水洗澡那也是很幸福的了。这让笔者在刚……5G手机除了上网速度快,还能做什么?5G手机上网速度比4G手机快不到哪去,准确的说5G手机的优势是下载速度快,一部大片2,3秒就能下到手机里,这个点确实4G手机比不了。问题是谁没事干手机下载电影玩?5G的特……高中辍学的福建小伙,用1万元缔造千亿帝国,可惜只是昙花一现近日,QuestMobile公布了《中国移动互联网2021半年大报告》。根据报告,在2021年半年度,中国移动互联网实力价值榜图片美化、拍照摄影赛道用户规模APP排行榜中……知乎否认视频部门几乎裁掉一半员工没有裁员计划IT之家2月11日消息,今日Tech星球报道,近日有网友爆料称,知乎目前正在低调裁员,主要是视频相关的部门,几乎裁掉一半员工。对此,知乎方面回应称:视频是知乎内容生态不可……等等党又赢了!618来袭一加9R到手价只需2799元进入到6月份,也就是说一年一度的618年中狂欢即将打响。作为等等党,我们要做的就是备足弹药准备淘宝一波。而商家要做的就是为了在于其他商家的竞争中取得优势,放出更多的福利,在手机……黑洞也有质量极限我们的宇宙年龄已经有137年了,现在天文科学家对于宇宙是怎样诞生的都有一个统一的理论,那就是宇宙的诞生于一场极其剧烈的大爆炸,那场大爆炸后就有时间和空间,宇宙大爆炸的短时间内宇……不买新电脑不能升级Win11?长期以来,Windows一直是PC重要的组成部分,以至于我们无法想象一个没有它之后会如何。虽然经历过起起落落,但目前的Windows10一直是一个相对稳定的版本。8……不允许用户使用昵称Meta(FB。US)在德国最高法院败诉智通财经APP获悉,德国最高民事法院裁定,Meta平台(FB。US)旗下的Facebook拒绝两名德国人在其Facebook账户上使用虚构姓名的权利是错误的。德国联邦法院……有没有人买过移动空调,效果和价格如何,如何排水?我就买过一台,大概有七八年了。不过这几年都没用,就刚买那一两年用。因为刚买那一两年是租房子住,租的房子没有空调。想装一台吧,一个又要问房东同意不同意。而且租房子总是自己也……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网