对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象。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++类成员构造函数和析构函数顺序示例详细讲解...相关推荐

  1. java类定义的顺序_Java类及对象的初始化顺序

    1.初始化规则: 下面规则优先级从前往后依次降低 0.加载一个类时先初始化基类后初始化扩展类: 1.类的初始化高于对象的初始化: 类的初始化依靠静态代码(被static标识的),静态代码块.静态变量这 ...

  2. java类编来那个初始化顺序_Java类及对象的初始化顺序

    1.初始化规则: 下面规则优先级从前往后依次降低 ①.加载一个类时先加载初始化基类后加载初始化扩展类: ②.类的初始化高于实例的初始化: 类的初始化依靠(静态代码块static{....})以及(静态 ...

  3. 2021-03-10 模板扩展类调用模板基类成员函数

    侯捷书内 : 扩展模板类 内通过  this->  指模板基类的成员函数,或通过   基类名::  的方式调用 基类成员函数 侯捷书内说: 扩展模板类,找不到模板基类的成员函数 但是在vs201 ...

  4. c++语言文件流,C++ IO类、文件输入输出、string流详细讲解

    新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...

  5. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  6. C++基类和派生类的构造函数(一)

    前面我们说基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成 ...

  7. C++ 基类和派生类的构造函数

    在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化. 解决办法: ...

  8. C++派生类含有成员对象构造函数析构函数顺序

    参考博客:传送门1 当类中含有对象成员时: 类的构造函数要包含对成员对象的初始化,如果构造函数的成员初始化列表没有包含对成员对象的初始化,系统会自动调用成员对象的无参构造函数.顺序上:先调用成员对象的 ...

  9. C++关于虚基类、构造函数、析构函数、成员对象的两个程序浅析

    预备博客: C++虚继承中构造函数和析构函数顺序问题以及原理 C++派生类含有成员对象构造函数析构函数顺序 C++虚基类成员可见性 程序一如下: #include<iostream> us ...

最新文章

  1. linux nobody 用户,Linux CentOS7安装配置tomcat8(使用非root用户/nobody用户运行)
  2. es6 Map、Set和Array.from()
  3. 数据结结构学习 ---赫夫曼树
  4. linux iptables 编译,Linux下编译安装iptables
  5. 关于arp.exe的一点应用
  6. 搜索 —— 深搜的剪枝技巧
  7. es6 默认的 Iterator 接口
  8. java哈希映射干什么的_java – 为什么在哈希映射中有空值或空键是有用的?
  9. python3爬取中国药学科学数据
  10. mysql数据库索引使用总结和对比
  11. vim amp; emacs color Scheme
  12. 中国范围NPP-VIIRS逐年夜间灯光数据(2013-2020年)
  13. 晨曦记账本记账,导出账目保存表格
  14. css阿拉伯数字,css 古文排版(含阿拉伯数字)
  15. 图像处理网络资源【转】
  16. HTML+CSS大作业——水果介绍-橙子之家(6页) HTML+CSS+JavaScript 学生dreamweaver网页设计作业成品
  17. 【复杂网络】网络科学导论学习笔记-第五章节点重要性与相似性
  18. 使用python调整图片大小
  19. windows win7电脑搜索功能失效怎么修复
  20. PHP的eregi函数:检查字符串的有效性

热门文章

  1. tomcat 轮询_用Spring长轮询Tomcat
  2. logback slf4j_强制Tomcat通过SLF4J / Logback登录
  3. 将Quartz与Spring集成
  4. Log4j 2.x XSD的描述不完整
  5. nosql的数据服务_使用NoSQL实现实体服务–第2部分:合同优先
  6. 为Twitter4j创建自定义SpringBoot Starter
  7. Apache Spark:更改架构之前必须解决的5个陷阱
  8. 使用docker-compose的Spring会话演示
  9. Hibernate READ_WRITE CacheConcurrencyStrategy如何工作
  10. EE Servlet 3:如何在Web应用程序中设置后端服务