1. class A {
  2. public:
  3. A() { cout<<"A's constructor"<<endl; }
  4. virtual ~A() { cout<<"A's Destructor"<<endl; }
  5. };
  6. class B : public A {
  7. public:
  8. B() { cout<<"B's constructor"<<endl; }
  9. virtual ~B() { cout<<"B's Destructor"<<endl; }
  10. };
  11. int main() {
  12. B b;
  13. return 0;
  14. }

输出结果:

A’s constructor

B’s constructor

B’s Destructor

A’s Destructor

请按任意键继续…

构造顺序是先调用父类的构造函数,析构时先析构子类的,再析构父类的,理解成从外到内嵌套

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <map>
  4. #include <vector>
  5. #define IMIN numeric_limits<int>::min()
  6. #define IMAX numeric_limits<int>::max()
  7. #define FR(i,n) for(int i=0;i<n;i++)
  8. #define CLC(x) memset(x,0,sizeof(x))
  9. #define FILL(x,c) memset(x,c,sizeof(x))
  10. using namespace std;
  11. #include <iostream>
  12. class A {
  13. public:
  14. A() { foo(); }
  15. virtual ~A() { foo(); }
  16. virtual void foo() { std::cout << "1"; }
  17. void bar() { foo(); }
  18. };
  19. class B : public A {
  20. public:
  21. virtual void foo() { std::cout << "2"; }
  22. };
  23. int main() {
  24. B b;
  25. b.bar();
  26. return 0;
  27. }

输出结果:121

定义B b,首先调用父类构造函数,父类构造函数调用自己所在的

foo(),输出1,然后bar(),调用B的foo(),B的是默认析构函数,最后调用B的A的析构函数

不能利用函数参数const与否来重载,只能是返回类型不同或参数个数或参数类型不同

带你理解C++对象初始化的不同方式

  1. #include<iostream>
  2. using namespace std;
  3. class MyClass
  4. {
  5. public:
  6. int n;
  7. public:
  8. MyClass(int i = 0) : n(i) { cout <<"fir: "<< n<<endl; }
  9. MyClass( MyClass &x) { n = ++(x.n); cout <<"sec:"<< n<<endl; }
  10. MyClass &operator=( MyClass &x) { n = --x.n; cout <<"third:" <<n<<endl;
  11. return *this;}
  12. ~MyClass() { cout << n; }
  13. };
  14. int main()
  15. {
  16. MyClass obj1(1), obj2(2);//直接初始化
  17. MyClass obj3 = obj1;//复制初始化
  18. MyClass obj4 ;//直接初始化
  19. obj4 = obj2;//赋值运算符
  20. return 0;
  21. }

输出:

fir: 1

fir: 2

sec:2

fir: 0

third:1

1212请按任意键继续…

来看看全局对象,静态对象,局部对象的析构顺序

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <map>
  4. #include <vector>
  5. #define IMIN numeric_limits<int>::min()
  6. #define IMAX numeric_limits<int>::max()
  7. #define FR(i,n) for(int i=0;i<n;i++)
  8. #define CLC(x) memset(x,0,sizeof(x))
  9. #define FILL(x,c) memset(x,c,sizeof(x))
  10. using namespace std;
  11. #include <iostream>
  12. class A {
  13. public:
  14. A() { cout<<"A's constructor"<<endl; }
  15. virtual ~A() { cout<<"A's Destructor"<<endl; }
  16. };
  17. class B{
  18. public:
  19. B() { cout<<"B's constructor"<<endl; }
  20. virtual ~B() { cout<<"B's Destructor"<<endl; }
  21. };
  22. class C{
  23. public:
  24. C() { cout<<"C's constructor"<<endl; }
  25. virtual ~C() { cout<<"C's Destructor"<<endl; }
  26. };
  27. class D{
  28. public:
  29. D() { cout<<"D's constructor"<<endl; }
  30. virtual ~D() { cout<<"D's Destructor"<<endl; }
  31. };
  32. class E{
  33. public:
  34. E() { cout<<"E's constructor"<<endl; }
  35. virtual ~E() { cout<<"E's Destructor"<<endl; }
  36. };
  37. C c;
  38. E e;
  39. int main() {
  40. A *pa = new A();
  41. B b;
  42. static D d;
  43. static E e;
  44. delete pa;
  45. return 0;
  46. }

C’s constructor

E’s constructor

A’s constructor

B’s constructor

D’s constructor

E’s constructor

A’s Destructor

B’s Destructor

E’s Destructor

D’s Destructor

E’s Destructor

C’s Destructor

请按任意键继续…

请按任意键继续…

构造函数的调用顺序是根据实际运行定义的先后

析构函数:

a.一旦delete就马上调用析构函数

b.局部对象的析构优先>static >global(同级之间按声明顺序逆序)

C++你不知道的事的更多相关文章

  1. setTimeout,setInterval你不知道的事

    javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...

  2. JavaScript 你不知道的事 -- 关于函数

    接上篇Javascript 你不知道的事,直接条列了: 每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto__ ...

  3. string.Format之你不知道的事

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  4. Gson 和 Fastjson 你不知道的事

    背景 目前在公司负责的业务, 主要是跟JSON数据打交道, fastjson .gson都用, 他们适用于不同场景.fastjson号称是业界处理json效率最高的框架, 没有之一.但在某些场景下, ...

  5. javascript线程解释(setTimeout,setInterval你不知道的事)---转载

    在工作中,可能我们经常遇到在有很多 setInterval 的页面, 再手动触发 setTimeout 的时候经常失败, 尤其是 jquery做动画的时候,一些渐入溅出的东西,很多东西都不被触发……, ...

  6. LoadRunner 你不知道的事之——内存使用

    LoadRunner的使用相信大家很熟悉,但是可能很少有人去关注一个Vuser 在以线程模式和进程模式下的内存开销情况,下面通过个人的试验得出一组数据供大家参考,只有你真正了解了,才能做的更深入. 测 ...

  7. 数据存储(一)--SharedPreferences之你不知道的事

    一.SharedPreferences将数据文件保存在指定路径上 SharedPreferences原则上是仅仅能保存在当前应用程序私有的shared_prefs文件夹中,只是也不是绝对的,我们能够用 ...

  8. javascript线程解释(setTimeout,setInterval你不知道的事)

    john resig写的一篇文章: 原文地址:http://ejohn.org/blog/how-javascript-timers-work/ 作为入门者来说,了解JavaScript中timer的 ...

  9. Android中那些有你不知道的事

    在安卓开发中,总有那么一些看似简单,实则绊脚的难题,等你去探索,等你去解决,也许你已经遇见了解决了,也许你还没碰上,写下这篇总结,希望能帮助那行即将遇到的朋友,快速解决这些小问题! 一.activit ...

  10. 一、关于EF你不知道的事

    一.EF 1. 只做查询 ,不用做修改时可以用,提高EF查询性能 var list = db.Users.AsNoTracking().First(x=>x.Name).ToList();

随机推荐

  1. [调试笔记] 晚测5 T1 容易题

    众所周知,sbwzx在考试一结束就嚷嚷T1是个sb题.那他为什么调了2小时才调出来呢?快和小编一起看看吧. Sb题:指除了sbwzx别人都能做出来的题 1.CE:震惊!sbwzx竟然连map都不会用, ...

  2. 2021.9.12考试总结[NOIP模拟51]

    T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...

  3. MIPI归纳---为什么阻抗为100欧姆

    根据LVDS(Low Voltage Differential Signaling)电平定义的. LVDS差分信号PN两线最大幅度是350mV,内部一个恒流源电流是3.5mA.于是终端匹配电阻是100 ...

  4. 《基于SD-SEIR模型的实验室人员不安全行为传播研究》

    My Focus:基于SD-SEIR模型的实验室人员不安全行为的传播; 建模与实验仿真 Title: Study on Porpagation of Unsafe Bhavior of Laborat ...

  5. fatal error: sqlite3.h: No such file or directory

    编译带有sqlite3的数据库c语言程序时,出现fatal error: sqlite3.h: No such file or directory,找不到头文件的问题.应该是是系统没有安装函数库. 在 ...

  6. hdu 3887 Counting Offspring(DFS序【非递归】+树状数组)

    题意: N个点形成一棵树.给出根结点P还有树结构的信息. 输出每个点的F[i].F[i]:以i为根的所有子结点中编号比i小的数的个数. 0<n<=10^5 思路: 方法一:直接DFS,进入 ...

  7. sed 修改替换包含关键字的整行

    查找关键字 user10 所在的行,替换整行内容为aaaaaaaaaa #sed -i "s/^.*user10.*$/aaaaaaaaaa/" useradd.txt

  8. Effective java 读书笔记(2)

    第四条:通过私有构造器强化不可实例化的能力 有时可能需要编写只包含静态方法和静态域的类,这样的工具类不希望被实例化,因为实例化对它来说没有意义. 然而,在缺少显式构造器的情况下,系统会自动提供一个缺省 ...

  9. Java学习笔记:GUI基础

    一:我们使用到的java GUI的API可以分为3种类: 组件类(component class) 容器类(container class) 辅助类(helper class) 1:组件类:组件类是用 ...

  10. 如何系统学习C 语言(下)之 文件篇

    我们所编写的程序源代码以及编译生成的可执行文件都属于文件.所以文件的实质就是存储在外部存储介质上的一段连续的二进制数据. c 语言程序对文件的处理采用文件流的形式,程序运行在内存中,而文件是存储在外部 ...