C++ 构造和析构的顺序

Wesley13
• 阅读 609

直接用代码说明问题:

#include <iostream>
using namespace std;

class A {
public:
  A(int a = 0) : _a(a) { cout << "Constructor A!" << _a << endl; }
  ~A() { cout << "Destrucotr A!" << _a << endl; }

private:
  int _a;
};

class B : public A {
public:
  B(int a = 0, int b = 0) : A(a), _b(b) {
    cout << "Constructor B!" << _b << endl;
  }
  ~B() { cout << "Destrucotr B!" << _b << endl; }

private:
  int _b;
};

class D {
public:
  D(int d = 0) : _d(d) { cout << "Constructor D!" << _d << endl; }
  ~D() { cout << "Destrucotr D!" << _d << endl; }

private:
  int _d;
};
class C : public B, public D {
public:
  C(int a = 0, int b = 0, int c = 0, int d = 0) : B(a, b), D(d), _c(c) {
    cout << "Constructor C!" << _c << endl;
  }
  ~C() { cout << "Destrucotr C!" << _c << endl; }

private:
  int _c;
};
int _tmain(int argc, _TCHAR *argv[]) {
  B a(6), b(7, 8);
  C c(1, 2, 3), d(12, 13, 14, 15);
  return 0;
}

// OUtput:
// Constructor A!6// Constructor B!0// Constructor A!7// Constructor
// B!8// Constructor A!1// Constructor B!2// Constructor D!0// Constructor C!3//
// Constructor A!12// Constructor B!13// Constructor D!15// Constructor C!14//
// Destrucotr C!14// Destrucotr D!15// Destrucotr B!13// Destrucotr A!12//
// Destrucotr C!3// Destrucotr D!0// Destrucotr B!2// Destrucotr A!1//
// Destrucotr B!8// Destrucotr A!7// Destrucotr B!0// Destrucotr A!6
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
C++ 析构函数与内存池
CPrimer书中也提到编写class时要注意copycontrol成员(拷贝构造函数,赋值操作符,析构函数,C11又多个移动构造函数)。工作时在C和C之间切换,有时就忘记了C的细节(真的好讨厌)。C析构函数与构造函数对应,构造对象时调用构造函数,析构对象时调用析构函数,于是可以在对象的析构函数中释放资
Wesley13 Wesley13
3年前
union共用体的对齐
unionDATE{chara;inti5;doubleb;};DATEmax;cout<<sizeof(max)<<endl;这个问题很好回答,并且我把这个问题归结于基本概念题(就是入门书必须介绍的)。我想一般来
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
C++
include<iostreamusingnamespacestd;classGoods{public:Goods()//货物的无参构造{weight0;nextN
Wesley13 Wesley13
3年前
C++——Linux——Hello World!
include  //include位置:/usr/includeincludeusingnamespacestd;intmain(){cout<<"HelloWorld"<     return0;}gotesttest.cpp//用ggcc编译会出
Wesley13 Wesley13
3年前
C++中构造函数和析构函数
构造函数定义它是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。另外,一个类可以有多个构造函数,我们可以根据其参数个数的不同或参数类型的不同来区分它们(这就是构造函数的重载)特点1.构造函数的命名必须和类名完全相同;2.构造函数的功能主要用于在类的对象创建时定义
Wesley13 Wesley13
3年前
C++构造函数调用虚函数的后果
include<iostreamclasscx{public:virtualvoidfunc(){std::cout<<"func"<<std::endl;}cx(){func();//构
Stella981 Stella981
3年前
C++virtual的工作原理
在C中要想正确的重写方法,就必须使用virtula关键字,用来声明方法为虚的如果不声明为虚方法就会出现一些微妙的错误.例如:classSuper{public:voidgo(){cout<<"supergo"<<endl;}}classSub:cla
Wesley13 Wesley13
3年前
C++进阶
///任何时候都不要在构造函数或析构函数中调用虚函数/classdog{public:stringm_name;
小万哥 小万哥
7个月前
深入理解 C++ 语法:从基础知识到高级应用
C语法让我们将以下代码分解以更好地理解它:示例cppincludeusingnamespacestd;intmain()cout<<"HelloWorld!";return0;示例解释第1行:include是一个头文件库,它让我们可以使用输入和输出对象