什么是构造函数和析构函数,其作用是什么-有哪些类型的构造函数-分别会在什么时候调用-

网上有关“什么是构造函数和析构函数,其作用是什么?有哪些类型的构造函数?分别会在什么时候调用?”话题很是火热,小编也是针对什么是构造函数和析构函数,其作用是什么?有哪些类型的构造函数?分别会在什么时候调用?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

构造函数是在定义类对象时有程序自动调用的为类提供初始化操作的函数,其函数名和类名相同,无返回值。析构函数则做的事相反工作,主要是对类进行清理操作,当然你也可以在析构函数中做其他你想做的事情。通常析构函数是释放在构造函数中申请的内存。在构造函数前加~就可以构成析构函数,同样没有返回值,值得注意的是,析构函数最后定义为虚析构函数。

1、为什么构造函数不可以是虚函数

①从存储空间角度

虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。

②从使用角度

虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。

虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。

③构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象时我们总是要明确指定对象的类型,尽管我们可能通过实验室的基类的指针或引用去访问它。但析构却不一定,我们往往通过基类的指针来销毁对象。这时候如果析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数。

④从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数

从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有太大的必要成为虚函数

⑤当一个构造函数被调用时,它做的首要的事情之一是初始化它的V P T R。因此,它只能知道它是“当前”类的,而完全忽视这个对象后面是否还有继承者。当编译器为这个构造函数产生代码时,它是为这个类的构造函数产生代码- -既不是为基类,也不是为它的派生类(因为类不知道谁继承它)。

所以它使用的V P T R必须是对于这个类的V TA B L E。而且,只要它是最后的构造函数调用,那么在这个对象的生命期内, V P T R将保持被初始化为指向这个V TA B L E, 但如果接着还有一个更晚派生的构造函数被调用,这个构造函数又将设置V P T R指向它的 V TA B L E,等.直到最后的构造函数结束。V P T R的状态是由被最后调用的构造函数确定的。这就是为什么构造函数调用是从基类到更加派生 类顺序的另一个理由。

但是,当这一系列构造函数调用正发生时,每个构造函数都已经设置V P T R指向它自己的 V TA B L E。如果函数调用使用虚机制,它将只产生通过它自己的V TA B L E的调用,而不是最后的V TA B L E(所有构造函数被调用后才会有最后的V TA B L E)。

2、为什么析构函数可以是虚函数

编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。

所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。

C++不把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。

关于“什么是构造函数和析构函数,其作用是什么?有哪些类型的构造函数?分别会在什么时候调用?”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

本文来自作者[沛柳姑娘]投稿,不代表半刻号立场,如若转载,请注明出处:https://www.bankexs.com/bk/867.html

(33)

文章推荐

  • 和女孩去逛街买东西要注意什么

    网上有关“和女孩去逛街买东西要注意什么”话题很是火热,小编也是针对和女孩去逛街买东西要注意什么寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1别嫌烦,别显出你很累啊或者很无聊~2然后注意他的眼光有没有长久的停留在什麽东西上那她就是在暗示你卖给

    2025年09月25日
    19303
  • 情人节送老婆什么礼物最有意义?

    网上有关“情人节送老婆什么礼物最有意义?”话题很是火热,小编也是针对情人节送老婆什么礼物最有意义?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。情人节送老婆糖果与鲜花、带她去放松一下、一场她喜欢的表演、送实用的生活用品、一次说走就走的旅行、补拍一次婚纱照都是

    2025年09月26日
    25319
  • 万能打印机和uv打印机区别是什么?

    网上有关“万能打印机和uv打印机区别是什么?”话题很是火热,小编也是针对万能打印机和uv打印机区别是什么?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。区别:1、相同点:万能打印机和uv打印机都是同一种设备,称呼叫法不同而已。2、墨水及固化系统不同:万能打印

    2025年09月27日
    21313
  • 【疫情源头一家4口感染,疫情一家五口感染】

    山东日照一家4人核酸呈阳性,当地疫情的源头是什么?事情的详情。日照五莲的一号病人曾经在2021年的10月15号前往银川出差,而在10月18号的时候,返回到了日照五莲。后来在进行核酸检测的时候,赵某与自己的妻子还有子女四人,核酸全部都呈阳性,而在进行核酸复检的时候,发现依旧是阳性,于是就把这一家四口

    2025年09月28日
    17319
  • 全国31省疫情最新消息(全国31省疫情最新通报)

    警惕!本土新增87+53丨4名中学生确诊,为同班同学→1、北京一中学内有九命同学确诊了阳性,肯定会影响学生开学,因为如果正常进行开学,会导致更大面积的人员感染,到时候进行疫情防控会更加的苦难。10人阳性!山西发布最新传染病疫情1、月18日,山西省发布了最新的传染病疫情信息,其中晋城市和运城市报告

    2025年09月29日
    13313
  • 包含北京新增2例本土确诊的词条

    北京新增2例本土感染者,轨迹公布,他们都去过哪些地方?1、虽然说他们居住在石景山地区,但是他们两个人不仅去了门头沟区上班,同时还有一个人去了内蒙古出差。看见了两个人的轨迹图以后,大家也会觉得非常害怕。针对这种情况,很多地区也进行了封闭管理,所以群众们也不要过于慌张。在这个过程当中,大家只要配合防疫

    2025年09月30日
    14301
  • 全国各地疫情峰值(各地疫情程度)

    上海第一波疫情大约什么时候达到峰值第一批:河北、河南、湖北、重庆、四川、云南、广东、北京、天津、辽宁等省市,高峰时间在12月20日前。这些地区由于人口密集、流动性大,加之冬季气候等因素,使得疫情传播速度较快。第二批:陕西、山西、山东、贵州、广西、吉林等省份,感染高峰期在12月20日至12月30日之

    2025年09月30日
    18310
  • 【北京疫情扩散很高,北京疫情有扩散】

    北京疫情反弹,食品溯源真的不能再等了!1、近日,北京疫情出现反弹,多日连续新增多例本地新型冠状病毒肺炎确诊病例和无症状感染者,其来源基本指向北京最大的“菜篮子”——新发地农贸批发市场。这一事件不仅牵动了全国人民的心,也再次凸显了食品溯源的重要性和紧迫性。疫情反弹与食品溯源的关联北京此次疫情反弹,

    2025年09月30日
    11320
  • 主题卧室/主题卧室篮球

    卧室房间有哪些类型卧室房间的类型主要有以下几种:标准单人卧室标准单人卧室是最常见的卧室类型,通常包括一张床、一张书桌、一把椅子和衣柜等基本家具。这种卧室适用于单身人士或儿童,虽然简单,但功能齐全,既满足休息需求,也兼顾工作和学习。单人间:这类房间通常面积在16至20平方米之间,配备有卫生间和其

    2025年10月01日
    13303
  • 成都疫情最新数据消息(成都疫情最新情况通报)

    成都现在的疫情怎么样了1、成都市疾控中心应急办主任范双凤在成都市疫情防控工作新闻发布会上透露,目前成都市“25”疫情形势十分严峻,疫情进展极为迅速。截至发布会时间(28日12时),此轮疫情全市已累计报告本土阳性感染者119例。更为关键的是,已经完成病例的基因测序结果均显示为奥密克戎变异株BA.76

    2025年10月02日
    10314
  • 【保定疫情最新数据消息,保定疫情最新消息2020】

    2022年11月27日保定工地停工防疫了吗截止2022年12月3日,停工了。截止2022年12月3日保定疫情防控部门发布的消息,2022年11月26日0-24时,保定新增本土确诊3病例、新增本土无症状感染者30例、因疫情分布比较扩散,工地属于人流密集的场所,因此已经开始停工防疫。高碑店市应对新冠肺

    2025年10月03日
    8314
  • 【北京13人感染新冠病源来自何处?,北京新冠患者源头】

    顺义区局部聚集性疫情问责,五人被处理,他们是被怎么处理的?从通报的情况看,这两起聚集性疫情的发生,与相关单位防疫责任的严重缺失密不可分。在中铁十一局三公司聚集性疫情中,房山区阎村镇政府和吴庄村村委会连辖区的人员底数都没有摸清,甚至在出现确诊病例后,都未迅速组织摸底,导致疫情扩散的风险大大增加。不管

    2025年10月03日
    5319

发表回复

本站作者才能评论

评论列表(3条)

  • 沛柳姑娘的头像
    沛柳姑娘 2025年09月17日

    我是半刻号的签约作者“沛柳姑娘”

  • 沛柳姑娘
    沛柳姑娘 2025年09月17日

    本文概览:网上有关“什么是构造函数和析构函数,其作用是什么?有哪些类型的构造函数?分别会在什么时候调用?”话题很是火热,小编也是针对什么是构造函数和析构函数,其作用是什么?有哪些类型的构...

  • 沛柳姑娘
    用户091710 2025年09月17日

    文章不错《什么是构造函数和析构函数,其作用是什么-有哪些类型的构造函数-分别会在什么时候调用-》内容很有帮助