c++构造顺序

1. 静态成员最先构造,按照静态成员初始化顺序,不是类里面的声明顺序

2. 父类构造

3. 非静态成员构造,按照类成员声明顺序,不是逗号初始化成员顺序

4. 自身构造函数

Demo:

class TestA
{
public:
	TestA(){
		std::cout << "TestA()" << std::endl;
	}
};

class TestB
{
public:
	TestB(int b) {
		std::cout << "TestB()" << std::endl;
	}
};

class TestC
{
public:
	TestC(int c) {
		std::cout << "TestC()" << std::endl;
	}
};

class TestD
{
public:
	TestD() {
		std::cout << "TestD()" << std::endl;
	}
};

class TestE
{
public:
	TestE() {
		std::cout << "TestE()" << std::endl;
	}
};

class Father
{
public:
	Father() {
		std::cout << "Father()" << std::endl;
	}
	~Father() {
		std::cout << "~Father()" << std::endl;
	}
};

class SonA : public Father
{
public:
	SonA(int num1, int num2)
	:m_C(num1)
	,m_B(num2)
	{
		std::cout << "SonA()" << std::endl;   //先Father,最后Son
	}
	~SonA() {
		std::cout << "~SonA()" << std::endl;
	}
public:
	static TestD m_gD;
	static TestE m_gE;

private:
	TestA m_A;
	TestB m_B;
	TestC m_C;  //member声明顺序 A,B,C,逗号初始化顺序忽略
};

TestE SonA::m_gE;
TestD SonA::m_gD;   //static初始化顺序 E,D

int main()
{
	SonA son(1, 2);
}

输出:

TestE()
TestD()
Father()
TestA()
TestB()
TestC()
SonA()

  

原文地址:https://www.cnblogs.com/leehm/p/11809015.html

时间: 2024-08-02 13:02:43

c++构造顺序的相关文章

c++ 类的构造顺序

在单继承的情况下,父类构造先于子类,子类析构先于父类,例: class A { public: A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; } }; class B : public A { public: B() { cout << "B" << endl; } ~B() { cout <<

第21课 对象的构造顺序

1. 对象的构造顺序 (1)对于局部对象:当程序执行流到达对象的定义语句时进行构造 [实例分析]局部对象的构造顺序 (2)对于堆对象 ①当程序执行流到达new语句时创建对象 ②使用new创建对象将自动触发构造函数的调用 [编程实验]堆对象的构造顺序 (2)对于全局对象 ①对象的构造顺序是不确定的 ②不同的编译器使用不同的规则确定构造顺序 [实例分析]全局对象的构造顺序 2.小结 (1)局部对象的构造顺序依赖于程序的执行流 (2)堆对象的构造顺序依赖于new的使用顺序 (3)全局对象的构造顺序是不

C/C++ 多继承(虚继承和构造顺序)

C/C++:一个基类继承和多个基类继承的区别 1.对个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性,而如果出现在同一阶层, 则会 出现二义性,解决办法:要么在同一阶层的底层(派生类)中重新定义可以解决,或者使用虚继承(减少部分二义性) 2.虚继承保证多次继承相同基类但只有一份基类数据(保证共享); 3.虚继承的构造顺序由编译器按照派生类列表从左往右寻找虚基类函数,先构造虚基类部分,然后按照正常构造从

C和C++的面向对象专题(7)——单例模式解决静态成员对象和全局对象的构造顺序难题

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 七.单例模式解决静态成员对象和全局对象的构造顺序难题 上回书说道,我们的程序有一个隐藏的漏洞,如果ClassRegister这个类所在的.o文件,如果在所有.o文件中是第一个被链接的的,那么就不会出问题. 这么说太抽象了,让我们画个图表 ClassRe

对象的构造顺序(十六)

在 C++ 中的类可以定义多个对象,那么对象构造的顺序是怎样的呢?对于局部对象:当程序执行流到达对象的定义语句时进行构造.我们以代码为例进行分析 #include <stdio.h> class Test { private:     int mi; public:     Test(int i)     {         mi = i;                  printf("Test(int i): %d\n", mi);     }          Te

第21课对象的构造顺序

对象的构造顺序一C++中的类可以定义多个对象,那么对象的构造顺序是怎样的呢?对于局部对象当程序执行流到达对象的定义语句时进行构造对象定义------>构造 原文地址:https://www.cnblogs.com/-glb/p/11846137.html

多继承的构造顺序

构造函数按一下顺序被调用: 1.按虚拟基类被继承的顺序 2.按非虚拟基类被继承的顺序 3.按成员函数被声明的顺序 4.类自己的构造函数 #include<stdio.h> #include<iostream> #include<assert.h> using namespace std; class OBJ1 { public: OBJ1(){ cout<<"OBJ1"<<endl; } }; class OBJ2 { pub

C++入门经典-例8.6-多重继承的构造顺序

1:单一继承是先调用基类的构造函数,然后调用派生类的构造函数,但多重继承将如何调用构造函数呢?多重继承中的基类构造函数被调用的顺序以派生表中声明的顺序为准.派生表就是多重继承定义中继承方式后面的内容,调用顺序就是按照基类名标识符的前后顺序进行的. 2:代码如下: // 8.6.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class CBicycle

C++类成员初始化列表的构造顺序

看下面代码, 输出结果是多少呢? class A{ public: A(int k) : j(k), i(j) { } void show() { cout << this->i << endl; cout << this->j << endl; } private: int i; int j; }; void test() { A a(3); a.show(); } int main(int argc, char const *argv[])