我想对面向对象有了解的童鞋应该不会对类和对象感到陌生吧 !

对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象。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++ 类成员的构造和析构顺序的更多相关文章

  1. C++浅析——继承类中构造和析构顺序

    先看测试代码,CTEST 继承自CBase,并包含一个CMember成员对象: static int nIndex = 1; class CMember { public: CMember() { p ...

  2. C++ //继承中构造和析构顺序

    1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class Base 6 { 7 pu ...

  3. 再探Delphi2010 Class的构造和析构顺序

    发了上一篇博客.盒子上有朋友认为Class的构造和析构延迟加载.是在Unit的初始化后调用的Class的构造.在Unit的反初始化前调用的Class的析构函数. 为了证明一下我又做了个试验 unit ...

  4. C++程序设计方法3:派生类对象的构造和析构过程

    基类中的数据成员,通过继承成为派生类对象的一部分,需要在构造派生类对象的过程中调用基类构造函数来正确初始化: 若没有显示调用,则编译器会自动生成一个对基类的默认构造函数的调用. 若想要显示调用,则只能 ...

  5. C++语法小记---继承中的构造和析构顺序

    继承中构造和析构的顺序 先父母,后客人,最后自己 静态变量和全局变量在最开始 析构和构造的顺序完全相反 #include <iostream> #include <string> ...

  6. C++ 类 、构造、 析构、 重载 、单例模式 学习笔记及练习

    一.拷贝构造函数 1.是一种特殊的构造函数,就是用一个已有的对象去构造其同类的副本对象,即对象克隆. class 类名 { 类名(类名& that) { 对类成员挨个赋值 ... } } 练习 ...

  7. C++构造和析构的顺序

    C++构造函数和析构函数的顺序 #include <iostream> using namespace std; class CA {public: CA() { cout << ...

  8. C++中的析构顺序和cosnt对象

    1,当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 2,单个对象创建时构造函数的调用顺序(工程经验总结): 1,调用父类的构造过程: 2,调用成员变量的构造函数(调用顺序与声明顺序相同): ...

  9. C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}

    C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...

随机推荐

  1. luogu P1192 台阶问题

    https://www.luogu.org/problem/show?pid=1192 登楼梯 肯定能想到  dp[i] = dp[i-1] + dp[i-2] + ...+ dp[i-k] 然后想到 ...

  2. POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)

    http://poj.org/problem?id=2513 题意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 思路: 题目很明 ...

  3. 使用 if 表达式

    由于 if 本质上是一个原函数,它的返回值就是满足条件分支表达式的值,因此,if 表达式也可以用作内联函数.我们以 check_positive( )为例进行说明.尽管条件表达式中不另写 return ...

  4. Django配置让其他电脑访问网站(包括:修改IP和端口)

    http://blog.sina.com.cn/s/blog_9c5364110101fyk7.html

  5. Binding.RelativeSource 属性

    Binding.RelativeSource 属性说明: 通过指定绑定源相对于绑定目标的位置,获取或设置绑定源. 此属性通常用于将对象的某个属性绑定到该对象的另一个属性,或用于在样式或模板中定义绑定. ...

  6. bzoj 1318 [SPOJ744] Longest Permutation (排列)

    大意: 给定序列, 求选出一个长度为k的区间, 使得区间内的数为[1,k]的排列, 且要求k最大 这题好神啊. 每个排列有且仅有一个1, 我们按1将序列分成若干子问题来处理, 而每个位置最多属于两个子 ...

  7. Leetcode 15

    //用类似双指针的方法,确定第一个i的位置后,j和k向左向右移动使nums[j]+nums[k] = -nums[i];注意特判 class Solution { public: vector< ...

  8. python学习笔记(三)---python关键字及其用法

    转载出处:https://www.cnblogs.com/ECJTUACM-873284962/p/7576959.html 前言 最近在学习Java Sockst的时候遇到了一些麻烦事,我觉得我很有 ...

  9. 解决Myeclipse闪退问题

    才安装好Myeclipse就出了问题,打开之后没过多久就自动退出了,看了好多解决方法都无效,后来才找到正确路径,转载过来方便跟我遇到同样问题的小伙伴,尽快解决 转载自:http://blog.csdn ...

  10. ActiveX开发

    转自(http://blog.csdn.net/mingojiang/article/details/8159263) 一.ActiveX基础 1.1什么是ActiveX ActiveX是COM规范的 ...