c++语言 自己构造函数 成员对象构造函数 调用顺序,C++类成员构造函数和析构函数顺序示例详细讲解...
对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象。C++遵循如下的创建顺序:
(1)如果某个类具体基类,执行基类的默认构造函数。
(2)类的非静态数据成员,按照声明的顺序创建。
(3)执行该类的构造函数。
即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数。
下面看一个例子吧
复制代码 代码如下:
class c
{
public:
c(){ printf("c\n"); }
protected:
private:
};
class b
{
public:
b(){ printf("b\n");}
protected:
c C;
private:
};
class a : public b
{
public:
a(){ printf("a\n"); }
protected:
private:
};
int main()
{
a A;
getchar();
}
分析一下吧 首先定义了3个类 a b c,其中a继承自b ,在main函数里面构造a ,因为a是继承b ,所以会先构造b,然后b类又有一个成员c类,所以c类是最先构造的,然后是b ,最后才是a。
在看一个例子,就是上面的该了一下:
复制代码 代码如下:
class c
{
public:
c(){ printf("c\n"); }
protected:
private:
};
class b
{
public:
b(){ printf("b\n");}
protected:
private:
};
class a : public b
{
public:
a(){ printf("a\n"); }
protected:
c C;
private:
};
int main()
{
a A;
getchar();
}
没有改变多少,只是在a添加了c成员,而b去掉了。
同样是在main里面构造a ,a继承自b,所以先构造b,然后构造a本身的数据成员c,最后才调用的a本身的构造函数。。
这里大家应该明白构造的细节了吧 。。
接下来看析构的顺序:
(1)调用类的析构函数。
(2)销毁数据成员,与创建的顺序相反。
(3)如果有父类,调用父类的析构函数。
也看一个例子吧:
复制代码 代码如下:
class c
{
public:
c(){}
~c(){ printf("c\n"); }
protected:
private:
};
class b
{
public:
b(){}
~b(){ printf("b\n");}
protected:
private:
};
class a : public b
{
public:
a(){}
~a(){ printf("a\n"); }
protected:
c C;
private:
};
int main()
{
a A;
return 0;
}
其过程是,在main函数结束时,会销毁a,就会先调用a的析构函数,先后销毁a的数据成员c,最后销毁a的父类b。其实就是跟创建时的顺序反了过来。
好了,到这里相信大家已经明白构造析构的奥秘了吧!
c++语言 自己构造函数 成员对象构造函数 调用顺序,C++类成员构造函数和析构函数顺序示例详细讲解...相关推荐
- java类定义的顺序_Java类及对象的初始化顺序
1.初始化规则: 下面规则优先级从前往后依次降低 0.加载一个类时先初始化基类后初始化扩展类: 1.类的初始化高于对象的初始化: 类的初始化依靠静态代码(被static标识的),静态代码块.静态变量这 ...
- java类编来那个初始化顺序_Java类及对象的初始化顺序
1.初始化规则: 下面规则优先级从前往后依次降低 ①.加载一个类时先加载初始化基类后加载初始化扩展类: ②.类的初始化高于实例的初始化: 类的初始化依靠(静态代码块static{....})以及(静态 ...
- 2021-03-10 模板扩展类调用模板基类成员函数
侯捷书内 : 扩展模板类 内通过 this-> 指模板基类的成员函数,或通过 基类名:: 的方式调用 基类成员函数 侯捷书内说: 扩展模板类,找不到模板基类的成员函数 但是在vs201 ...
- c++语言文件流,C++ IO类、文件输入输出、string流详细讲解
新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...
- C++中基类与派生类的构造函数和析构函数
1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...
- C++基类和派生类的构造函数(一)
前面我们说基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成 ...
- C++ 基类和派生类的构造函数
在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化. 解决办法: ...
- C++派生类含有成员对象构造函数析构函数顺序
参考博客:传送门1 当类中含有对象成员时: 类的构造函数要包含对成员对象的初始化,如果构造函数的成员初始化列表没有包含对成员对象的初始化,系统会自动调用成员对象的无参构造函数.顺序上:先调用成员对象的 ...
- C++关于虚基类、构造函数、析构函数、成员对象的两个程序浅析
预备博客: C++虚继承中构造函数和析构函数顺序问题以及原理 C++派生类含有成员对象构造函数析构函数顺序 C++虚基类成员可见性 程序一如下: #include<iostream> us ...
最新文章
- linux nobody 用户,Linux CentOS7安装配置tomcat8(使用非root用户/nobody用户运行)
- es6 Map、Set和Array.from()
- 数据结结构学习 ---赫夫曼树
- linux iptables 编译,Linux下编译安装iptables
- 关于arp.exe的一点应用
- 搜索 —— 深搜的剪枝技巧
- es6 默认的 Iterator 接口
- java哈希映射干什么的_java – 为什么在哈希映射中有空值或空键是有用的?
- python3爬取中国药学科学数据
- mysql数据库索引使用总结和对比
- vim amp; emacs color Scheme
- 中国范围NPP-VIIRS逐年夜间灯光数据(2013-2020年)
- 晨曦记账本记账,导出账目保存表格
- css阿拉伯数字,css 古文排版(含阿拉伯数字)
- 图像处理网络资源【转】
- HTML+CSS大作业——水果介绍-橙子之家(6页) HTML+CSS+JavaScript 学生dreamweaver网页设计作业成品
- 【复杂网络】网络科学导论学习笔记-第五章节点重要性与相似性
- 使用python调整图片大小
- windows win7电脑搜索功能失效怎么修复
- PHP的eregi函数:检查字符串的有效性
热门文章
- tomcat 轮询_用Spring长轮询Tomcat
- logback slf4j_强制Tomcat通过SLF4J / Logback登录
- 将Quartz与Spring集成
- Log4j 2.x XSD的描述不完整
- nosql的数据服务_使用NoSQL实现实体服务–第2部分:合同优先
- 为Twitter4j创建自定义SpringBoot Starter
- Apache Spark:更改架构之前必须解决的5个陷阱
- 使用docker-compose的Spring会话演示
- Hibernate READ_WRITE CacheConcurrencyStrategy如何工作
- EE Servlet 3:如何在Web应用程序中设置后端服务