博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
宋体、构造函数-浅出C++对象模型——理解构造函数、析构函数执行顺序-by小雨...
阅读量:6281 次
发布时间:2019-06-22

本文共 2961 字,大约阅读时间需要 9 分钟。

PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,码代几天不写就忘。目前又不当COO,还是得用心记码代哦!

   

    本文重要说明象对建创时结构函数的执行序次,象对成员的初始化序次;象对毁销时析构函数的执行序次,象对成员的毁销序次。

  

    “象对的结构从类层次的最根处开始,在每一层中,首先调用基类的结构函数,然后调用成员象对的结构函数。析构则格严按照与结构相反的序次执行,该序次是独一的,否则译编器将没法动自执行析构程过。

 

    一个趣有的现象是,成员象对初始化的序次全完不受它们在初始化表中序次的影响, 只由成员象对在类中声明的序次决议。这是因为类的声明是独一的,而类的结构函数可以有多个,因此会有多个不同序次的初始化表。如果成员象对按照初始化表的序次行进结构,这将致使析构函数没法到得独一的逆序。”(引用自References[1]

     

    从这里看,每种言语特性的存在必有其因原,习学这些特性就是懂得这些特性存在的因原。

    面下的一段码代是对面下这段话的说明,其中有4个类Foo, Bar, Base, Derived,它们的结构函数、拷贝结构函数、析构函数都有息信输出。

#include 
using namespace std;class Foo{public: Foo() { cout << "Foo constructor" << endl; } Foo(const Foo &foo) { cout << "Foo copy constructor" << endl; } ~Foo() { cout << "Foo deconstructor" << endl; }};class Bar{public: Bar() { cout << "Bar constructor" << endl; } Bar(const Bar &bar) { cout << "Bar copy constructor" << endl; } ~Bar() { cout << "Bar deconstructor" << endl; }};class Base{public: Base() { cout << "Base constructor" << endl; } ~Base() { cout << "Base deconstructor" << endl; }};class Derived : public Base{public: Derived() { cout << "Derived constructor without arguments" << endl; } Derived(const Foo &foo, const Bar &bar); Derived(const Bar &bar, const Foo &foo); ~Derived() { cout << "Derived deconstructor" << endl; }private: Foo m_foo; Bar m_bar;};Derived::Derived(const Foo &foo, const Bar &bar) : m_foo(foo), m_bar(bar){ cout << "Derived constructor with argument[Foo foo, Bar bar] passed by references" << endl;}Derived::Derived(const Bar &bar, const Foo &foo) : m_bar(bar), m_foo(foo){ cout << "Derived constructor with argument[Bar bar, Foo foo] passed by references" << endl;}int main (int argc, char** argv){ Foo foo; Bar bar; cout << "test case 1:" << endl; Derived deri_1; // (1) cout << "test case 2:" << endl; Derived deri_2(foo, bar); // (2) cout << "test case 3:" << endl; Derived deri_3(bar, foo); // (3) cout << "test case end" << endl; return 0;}

    执行结果是:

    

    

    打印出的息信可分为几部份:

    (1) 建创象对foobar ,执行Foo,Bar的结构函数

    (2) Test Case 1:建创象对deri_1,首先执行基类Base的结构函数,其次执行成员m_foo,m_bar的结构函数来结构成员,最后调用自身的结构函数(无参数)

    (3) Test Case 2:建创象对deri_2,调用序次与case 1序次同相。

    (4) Test Case 3:建创象对 deri_3,调用序次与case 1序次同相。注意到deri_2,deri_3的建创执行的是不同的Derived结构函数,虽然结构函数参数的序次不同,但是结构成员的序次是同相的。

    (5) 毁销象对deri_3,deri_2,deri_1,析构函数执行序次同相,与结构象对的序次相反。C++标准划定以象对声明相反的序次毁销这些象对。

    (6) 毁销象对bar,foo

    

    译编运行环境:

$ uname -aLinux localhost.localdomain 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux$ g++ --versiong++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52)

    References:

    [1]高质量C++编程指南

    [2] 

    转载本文请注明作者和出处,请勿用于任何商业用途!

    Author: Gary Gao 存眷互联网、动自化、件软团队 

文章结束给大家分享下程序员的一些笑话语录: 女人篇

  有的女人就是Windows虽然很优秀,但是安全隐患太大。
  有的女人就是MFC她条件很好,然而不是谁都能玩的起。
  有的女人就是C#长的很漂亮,但是家务活不行。
  有的女人就是C++,她会默默的为你做很多的事情。
  有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
  有的女人就是SQL,她会为你的发展带来莫大的帮助。

你可能感兴趣的文章
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《第一桶金怎么赚——淘宝开店创业致富一册通》一一第1章 创业梦想,怎样起步...
查看>>
基于容器服务的持续集成与云端交付(三)- 从零搭建持续交付系统
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
《Exchange Server 2010 SP1/SP2管理实践》——2.4 部署外部网络环境
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
《计算广告:互联网商业变现的市场与技术》一第一部分 在线广告市场与背景...
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>
《Arduino家居安全系统构建实战》——1.5 介绍用于机器学习的F
查看>>
jquery中hover()的用法。简单粗暴
查看>>
线程管理(六)等待线程的终结
查看>>
spring boot集成mongodb最简单版
查看>>