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

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

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

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://bankexs.com/bk/867.html

(25)

文章推荐

  • 那个高高的都是草莓的冰淇淋是什么

    网上有关“那个高高的都是草莓的冰淇淋是什么”话题很是火热,小编也是针对那个高高的都是草莓的冰淇淋是什么寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。草莓雪冰草莓雪冰是用草莓加上其它奶制品制作出来的冷饮,并且口感类似于人们日常使用的刨冰,但是因为有草莓果肉

    2025年09月14日
    33314
  • 历史上蓝齐儿真的嫁给葛尔丹了吗

    网上有关“历史上蓝齐儿真的嫁给葛尔丹了吗”话题很是火热,小编也是针对历史上蓝齐儿真的嫁给葛尔丹了吗寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。蓝齐儿是电视剧《康熙王朝》中的一名可以说充满传奇色彩的角色。在电视剧中,蓝齐儿是康熙的妃子所生,也是康熙的第三个女

    2025年09月15日
    31302
  • 你有哪些关于烤肉拌饭的腌料配方可以分享?

    网上有关“你有哪些关于烤肉拌饭的腌料配方可以分享?”话题很是火热,小编也是针对你有哪些关于烤肉拌饭的腌料配方可以分享?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。将鸡胸肉撕去筋膜,姜切条,鸡肉洗净切成丁放入碗中,加姜、烤肉料、盐、料酒、生抽、老抽和蚝油搅拌

    2025年09月15日
    33304
  • 最近准备去做施工员 想问下学做施工员难吗?

    网上有关“最近准备去做施工员想问下学做施工员难吗?”话题很是火热,小编也是针对最近准备去做施工员想问下学做施工员难吗?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。施工现场“七成多、八成少,九成就能当领导”的话,其实颇有点自嘲的意思。干了几年施工,还是很

    2025年09月15日
    32321
  • 如何健康又快速减肥?

    网上有关“如何健康又快速减肥?”话题很是火热,小编也是针对如何健康又快速减肥?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1、饭要在八点前吃对于减肥的人来说,早饭是比较要吃的,而且要在早上八点之前吃,同时还应该注意要补充蛋白质,碳水化合物,在早上你可以吃鸡

    2025年09月17日
    26310
  • 博诺安壁挂炉好不好 博诺安壁挂炉有哪些优势【详解】

    网上有关“博诺安壁挂炉好不好博诺安壁挂炉有哪些优势【详解】”话题很是火热,小编也是针对博诺安壁挂炉好不好博诺安壁挂炉有哪些优势【详解】寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。壁挂炉是我们现在生活中经常会使用到的一种产品,能够稳定的为我们提供热水,使

    2025年09月17日
    23320
  • 常见的岩石分为几类-用来做建筑材料的是那种岩石-

    网上有关“常见的岩石分为几类?用来做建筑材料的是那种岩石?”话题很是火热,小编也是针对常见的岩石分为几类?用来做建筑材料的是那种岩石?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。岩石主要分为三大类——岩浆岩,沉积岩,变质岩.火成岩也称岩浆岩.来自地

    2025年09月18日
    27314
  • 怎么保养新挖掘机

    网上有关“怎么保养新挖掘机”话题很是火热,小编也是针对怎么保养新挖掘机寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。(1)挖掘机的维护保养级别与项目挖掘机的保养级别包括每班(每日)保养、一级保养(每工作100h进行)、二级保养(每工作400h进行)和三级保养

    2025年09月18日
    29318
  • 成长皆有规律寻

    网上有关“成长皆有规律寻”话题很是火热,小编也是针对成长皆有规律寻寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。万事万物的生长都要遵循一定的规律,人的身心发展也有规律,可循。比如说3翻,6坐8爬,这是生理规律,有个三四十天的婴儿会翻身了,家人很开

    2025年09月21日
    20317
  • 宁波永达福宁汽车销售服务有限公司怎么样?

    网上有关“宁波永达福宁汽车销售服务有限公司怎么样?”话题很是火热,小编也是针对宁波永达福宁汽车销售服务有限公司怎么样?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。宁波永达福宁汽车销售服务有限公司是2014-02-28在浙江省宁波市鄞州区注册成立的一人有限责

    2025年09月21日
    22319
  • 汽车隔音有用吗-做汽车隔音需要注意什么?

    网上有关“汽车隔音有用吗?做汽车隔音需要注意什么?”话题很是火热,小编也是针对汽车隔音有用吗?做汽车隔音需要注意什么?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。最近有朋友问,汽车隔音有用吗?其实对原车隔音不满意的朋友可以通过汽车隔音改造来提高汽车隔音的效

    2025年09月21日
    18321
  • 战士怎么打架 战士打架技巧详解

    网上有关“战士怎么打架战士打架技巧详解”话题很是火热,小编也是针对战士怎么打架战士打架技巧详解寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1,战士与各职业的PK注意点打战士:不管级数高低硬顶吧,若是对方人多,要把对手顶离人群,随时变换你在对手的方位,方

    2025年09月22日
    18322

发表回复

本站作者才能评论

评论列表(3条)

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

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

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

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

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

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