继承关系中构造函数、析构函数的调用顺序详解
构造函数:
在c++中,当声明一个派生类的对象时,派生类中包含所有父类的数据成员以及自己添加的数据成员均已被分配了内存,只是尚未进行初始化配置(但实际上基本数据类型的变量已经被赋予随机默认值)。
构造函数的执行顺序:
当使用某一个类进行实例化对象时,往往需要传递参数, 该类在该类的所有父类构造完成后,首先调用内嵌对象的无参的默认构造函数,之后通过该类的构造函数体处理一些更具体地操作,比如给基本类型数据赋初值,至此该对象就通过传入的参数将所有数据都进行初始化。
而在整个构造过程中,存在两个不同方向的信息流和控制流:
- 当前类将参数传递给其父类构造函数,为了初始化父类中相对其祖先新增的数据成员或对内嵌对象进行赋值操作。此参数信息由于数量不同,可以向上传递到祖先的构造函数体,或者停留在中间某类的构造函数中。
- 参数信息流向祖先传递,最远可达最顶层父类的构造函数体。无论参数传递到哪个位置,构造的顺序不会变:从最顶层类调用内嵌对象的默认构造函数开始,接着调用最顶层类的构造函数体(根据参数有无、多少可以动态多态),至此结束最顶层的构造->控制流返回下一层,同样调用该层类内嵌对象的默认无参构造函数,然后进入该类的构造函数体初始化本类新增的数据成员...一直反复,直到控制流返回到最底层构造对象的类中,当该类的构造函数体执行完后,即认为该对象初始化完毕。(某些类中的成员变量没有在构造函数中初始化也不要紧,在该全过程中,无论是类的构造函数体,还是内嵌对象的无参默认构造函数,只要存在一处显式声明了的构造函数,即使函数体为空,什么也不做,此时编译器仍然认为对象已经被初始化;反之,所有过程中,构造函数都是凭借编译器生成的默认合成的构造函数,此时编译器认为该对象尚未被初始化,即使内部数据实际上还是有随机值的,仍会编译报错)
总结:
构造函数:
当构造一个对象时,从最顶层的父类到最底层的类,先调用自身内嵌对象的默认构造函数,再调用自身构造函数体,依次构造,从父类到最底层的类,先组件,后整体,逐步将欲构建的对象从最基本的父类数据成员一步步拓展到最终类的成员并初始化。值得注意的是,c++中内置类型(int、double、char等)或者复合型(指针,数组)在编译器自动生成的合成的默认构造函数中是不会进行初始化的;
无论是在类的内嵌对象中还是父类中,只要其显式地说明了构造函数,即使函数体为空,也能够成功访问到成员变量属性;反之,如果都没有明显的声明构造函数,则无法访问类的成员变量,提示使用了该类的未初始化的对象;
即:上图中类的构造函数体和内嵌对象的构造函数体都没有显式声明,而是由编译器默认创建,则将提示未初始化对象;
析构函数:
在构造函数中,先执行成员的初始化,且按照它们在类中出现的顺序进行初始化,然后执行函数体中的内容。在析构函数中,首先执行的是函数体,然后销毁成员。成员按初始化顺序的逆序进行销毁。所以你要认识到,析构函数体自身并不直接销毁成员,成员是在析构函数体之后隐含的析构阶段中被销毁的。在整个对象销毁过程中,析构函数体是作为成员销毁步骤之外的另一部分进行的。
参考资料:
C++中的析构函数和delete的关系
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数
继承关系中构造函数、析构函数的调用顺序详解相关推荐
- python类定义以及调用_python中如何定义和调用类详解
类的方法的定义 1.def fun_name(self,...); Pass 2.其中的参数self代表类的实例,在调用方法时由系统自动提供 3.方法定义时必须指明self参数 类的方法的调用 与普通 ...
- c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类
在继承关系中,虚函数.虚析构函数.虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理: 虚函数:函数重写时的要求编译器动态绑定来实现多多态 : 虚析构函数:当基类指针指向在堆内实现 ...
- 构造函数和析构函数的调用顺序
目录 构造函数和析构函数 构造函数 复制构造函数 析构函数 构造函数与析构函数的调用顺序 单继承 多继承 构造函数和析构函数 构造函数 构造函数是特殊的成员函数,与类同名,没有返回类型,而且允许重载. ...
- 继承关系中的拷贝构造函数和赋值操作重载函数分析
文章目录 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类 ...
- c++构造函数和析构函数的调用顺序研究
构造函数与析构函数的调用顺序 构造函数与析构函数的调用顺序 构造函数与析构函数的调用顺序 1)当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同:之后调用自身类的构造 ...
- 实验3.1 定义一个CPU类,观察构造函数和析构函数的调用顺序
题目 定义一个CPU类,包含等级(rank).频率(frequency).电压(voltage)等属性,有两个公有成员函数run.stop.其中,rank为枚举类型CPU_Rank,定义为enum C ...
- java 实例方法直接调用超类的实例方法_Java继承关系中,父类方法使用实例变量和调用实例方法的探究...
面向对象编程中,某一个实例方法使用实例变量和调用其它实例方法的情况是常见的.当存在继承关系时,这种情况就变得复杂起来.以下就对继承关系中,父类的某实例方法使用实例变量和其它实例方法的情况进行探究.因为 ...
- java继承关系中,父类private修饰的内容真的不能被继承吗?NO
前情引入 关于java的继承,初学的时候,一直认为父类中private修饰的东西时无法被子类继承.后来随着学习的深入,见得多了一些,看到一些文章博客的另一种观点:其实父类中的东西,除了构造方法之外,其 ...
- c语言 元组顺序随机化,为什么关系中的元组没有先后顺序且不允许有重复元组?...
满意答案 lxy70452 2013.03.31 采纳率:46% 等级:11 已帮助:8117人 1. 解释下述名词 关系模型,关系模式,关系实例,属性,域, 元组,超键,候选键,主键, 实体完 ...
最新文章
- 异步socket优雅的关闭-CancelIO和SO_LINGER
- kaggle的discussion区都是些什么鬼?
- 理解zookeeper选举机制
- git stash 缓存 简介
- u盘被保护怎样解除?(第十招)
- flutter offset_牛笔!自己用Flutter撸一个天气APP
- 一篇文章让你学透Linux系统中的more命令
- 3d人体智能测试软件,三维人体解剖软件(3dbody)
- 一步一步学JAVA(16)-IO流
- 艾司博讯:拼多多商家sku编码是什么意思
- 用javascript和jquery部分知识实现的打地鼠小游戏
- npm安装依赖报错——npm ERR gyp verb cli的解决方法 Node Sass version 7.0.1 is incompatible with ^4.0.0. 因为在此系统上禁止运
- 学成在线-第13天-讲义-在线学习 HLS
- 推荐系统 | 基础推荐模型 | 逻辑回归模型 | LS-PLM | PyTorch实现
- 抗洪救灾,共克时艰,城联优品捐赠10万元爱心物资驰援英德
- MAC M1/M2安装ADOBE等第三方软件问题终极解决 “开启任何来源”“无法检查更新,请确认您已接入互联网”“移除下载镜像的Quarantine属性” “闪退”【MACBOOK】
- 解决“javac”提示不是内部或外部命令的问题
- MySQL5数据库更改默认等待连接时间(wait_timeout)
- 音频之WAV格式编码解析
- win10 怎么清除电脑所有数据
热门文章
- 在CAD制图中,如何指定红线路径?
- 罗伯特扫地机器人电池如何取_自己动手iRobot Braava 380T扫地擦地机外挂电池记录...
- Beaver‘s Calculator(分层排序)
- QQ国际版汉化最简单方法
- 地址栏中文传值,解决乱码问题
- 利用永中office解决ubuntu下office文件无法显示音标的问题。
- 恒业微晶冲刺创业板上市:计划募资8亿元,戴联平为实控人
- 机器学习 | 关于决策树分类模型,你学得怎么样了?
- 职场礼仪.怎么写邮件
- 青龙面板脚本--操作