当前位置:  编程技术>c/c++/嵌入式

C++类成员构造函数和析构函数顺序示例详细讲解

    来源: 互联网  发布时间:2014-10-22

    本文导语:  对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象。C++遵循如下的创建顺序: (1)如果某个类具体基类,执行基类的默认构造函数。 (2)类的非静态数据成员,按照声明的顺序创建。 (3)执行该...

对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象。C++遵循如下的创建顺序:

(1)如果某个类具体基类,执行基类的默认构造函数。

(2)类的非静态数据成员,按照声明的顺序创建。

(3)执行该类的构造函数。

即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数。

下面看一个例子吧

代码如下:

class c
{
public:
    c(){ printf("cn"); }
protected:
private:
};

class b
{
public:
    b(){ printf("bn");}
protected:
    c C;
private:
};

class a : public b
{
public:
    a(){ printf("an"); }
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("cn"); }
protected:
private:
};

class b
{
public:
    b(){ printf("bn");}
protected:
private:
};

class a : public b
{
public:
    a(){ printf("an"); }
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("cn"); }
protected:
private:
};

class b
{
public:
    b(){}
    ~b(){ printf("bn");}
protected:
private:
};

class a : public b
{
public:
    a(){}
    ~a(){ printf("an"); }
protected:
    c C;
private:
};

int main()
{
    a A;
    return 0;
}



其过程是,在main函数结束时,会销毁a,就会先调用a的析构函数,先后销毁a的数据成员c,最后销毁a的父类b。其实就是跟创建时的顺序反了过来。

好了,到这里相信大家已经明白构造析构的奥秘了吧!


    
 
 

您可能感兴趣的文章:

  • C++ Maps 成员 key_comp():返回比较元素key的函数
  • 类A为什么从外包继承一个protected成员后,类A的子类为什么不能访问这个成员 iis7站长之家
  • C++ Maps 成员 value_comp():返回比较元素value的函数
  • 关于C++静态成员函数访问非静态成员变量的问题
  • C++ MultiMaps 成员 key_comp():返回比较key的函数
  • linux下类的成员函数不可以作为自定义的信号处理函数么?
  • C++ MultiMaps 成员 value_comp():返回比较元素value的函数
  • 一个基本概念问题:静态函数只能调用静态方法,类的成员函数也是静态的吗?
  • C++ STL Bitsets构造函数及成员函数解释及代码示例
  • 指向类成员函数的指针其实并非指针
  • C++ Strings(字符串) 成员 Constructors:构造函数,用于字符串初始化
  • 请问在linux下面编程怎样查询stl类的成员函数
  • c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
  • 如何在工作线程中调用图形界面线程的成员函数(串口通信)?
  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 怎样在一个类里面互相调用成员函数?
  • C++ STL库中priority_queue介绍,成员函数说明及priority_queue具体用法举例
  • linux的动态链接库开发的时候,基类带有虚成员函数的话会找不到符号。
  • 双向队列Deque 类成员函数列表参考(c++ STL 容器)
  • 如何编译含有静态成员函数的C++文件?
  • c++ STL关联式容器Map成员函数介绍及查找(find()),插入(insert()),删除(erase())等操作代码举例
  • 线程 和 成员函数 的问题
  • C++ I/O 成员 sync_with_stdio():同标准I/O同步
  • C++类中的常数据成员与静态数据成员之间的区别
  • C++ MultiMaps 成员 begin():返回指向第一个元素的迭代器
  • C++空类及没有成员变量的类的大小实例分析
  • C++ Vectors 成员 rbegin():返回Vector尾部的逆迭代器
  • C++类的静态成员初始化详细讲解
  • C++ Bitsets 成员 count():返回被设置的位的个数
  • C++调试追踪class成员变量的方法
  • C++ Bitsets 成员 flip():反转bits中的位
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ STL标准模板库类String成员详细列表参考及示例代码
  • c#使用反射调用类型成员示例
  • asp.net使用jQuery获取RadioButtonList成员选中内容和值示例
  • java命名空间java.lang.reflect类method的类成员方法: getdefaultvalue定义及介绍
  • 请问:什么是实例成员和类成员?
  • java命名空间java.security.acl接口group的类成员方法: ismember定义及介绍
  • 类A为什么从外包继承一个protected成员后,类A的子类为什么不能访问这个成员
  • java命名空间java.lang.reflect接口member的类成员方法: getname定义及介绍
  • 将父类变量强制赋予子类变量时,发生了什么?比如子类的成员变量,假如父类中有不存在子类中有的成员变量的情况,那么子类中该变量是否默认取值???
  • java命名空间java.security.acl接口group的类成员方法: addmember定义及介绍
  • getgrnam获得group结构后,如何遍历gr_mem成员或者组成员?
  • java命名空间java.lang.reflect接口member的类成员方法: declared定义及介绍
  • 类静态变量能定义在成员方法中吗?? 在线
  • java命名空间java.lang.reflect接口member的类成员方法: public定义及介绍
  • Python 面向对象 成员的访问约束
  • java命名空间java.security.acl接口group的类成员方法: members定义及介绍
  • 成员管理系统 ClubMaster
  • java命名空间java.lang.reflect接口member的类成员方法: getmodifiers定义及介绍
  • 深入C#实例成员和静态成员详解
  • java命名空间javax.sound.sampled类compoundcontrol的类成员方法: compoundcontrol定义及介绍
  • 如何把Object的各类型的数据成员填充到byte缓冲区
  • java命名空间java.lang类class<t>的类成员方法: ismemberclass定义及介绍
  • jsp Recordset 对象有 PageSize 成员吗
  • java命名空间java.security.acl接口group的类成员方法: removemember定义及介绍
  • public成员为什么找不到?头大啊……


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3