C++初始化顺序相关

C++初始化顺序相关

1. 设置函数默认参数的顺序: 从右到左

原因: 调用函数时填写参数的顺序是从左到右,因此默认参数必须从右到左给

2. 类的数据成员初始化列表初始化顺序为: 从右到左

例子:

class ClassA
{
public:
    ClassA():m_n2(0), m_n1(m_n2+2)
    {}
    void Print()
    {
        cout<<"m_n1: "<< m_n1 << " m_n2: "<< m_n2 <<endl;
    }
    ~ClassA()
    {}
private:
    int m_n1;
    int m_n2;
};
int _tmain(int argc, _TCHAR* argv[])
{
    ClassA obj;
    obj.Print();
    return 0;
}

输出结果: m_n1: 0xccccccce m_n2:0  (m_n2初始值为0xcccccccc)

3. 类的数据成员与构造函数的初始化顺序: 先初始化类的数据成员,再调用构造函数

原因: 调用构造函数的时候,构造函数可能需要访问数据成员,因此需要数据成员提前初始化好。

4. 类的数据成员与析构函数的销毁顺序: 先调用析构函数,再销毁类的数据成员

原因: 调用析构函数时,析构函数可能需要访问数据成员,因此需要数据成员稍后析构。

5. 构造函数的调用顺序(按照某大姐的说法:先有爷爷,再有父亲,再有儿子):

a. 基类构造函数  b. 子对象构造函数  c. 派生类构造函数

6. 析构函数的调用顺序:

a. 派生类的析构函数  b. 子对象的析构函数  c. 基类的析构函数

未完

时间: 2024-09-26 23:39:08

C++初始化顺序相关的相关文章

调整static变量初始化顺序的一个办法

// wrap the LaunchDir variable in a function to work around static/global initialization order static FString& GetWrappedLaunchDir() { static FString LaunchDir; return LaunchDir; } 在ue4中看到这么一段代码,注释有点意思 不同cpp文件里的全局static变量初始化顺序是不可控的 FString显然会依赖很多内存分配

Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

1.执行顺序 1.1.一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量.初始化块.构造器). 示例如下:(结果见注释) 1 class A { 2 public A() { 3 System.out.println("Constructor A."); 4 } 5

Java 对象初始化顺序 执行顺序

先看一道Java面试题: 求这段程序的输出. 解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题: 从程序的执行顺序去解答: 1.编译:当这个类被编译通知后,会在相应的目录下生成两个.class 文件.一个是 Base.class,另外一个就是Base$Sub.class.这个时候类加载器将这两个.class  文件加载到内存 2.Base base= new Sub(): 声明父类变量base对子类的引用,JAVA类加载器将Base,Sub类加载到JVM(Java虚拟

java类的初始化顺序

java类的初始化顺序 (2008-10-21 13:30:15) 转载▼ 标签: java 初始化 继承初始化 it 分类: Java 对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";

Java初始化顺序

1.在类的内部,变量的定义的先后顺序决定了初始化顺序,即使变量定义散布于方法定义间,他们仍旧会在任何方法(包括构造器)被调用之前得到初始化 2.静态数据的初始化 class Bowl{ Bowl(int marker){ print("Bowl("+marker+")"); } void f1(int marker){ print("f1("+marker+")"); } class Table{ static Bowl bo

Java 类中成员初始化顺序

Java 中的类成员 基本分为 静态成员, 实例变量  方法中特别的是静态方法和构造方法. 1.定义一个类 public class ClassLoaderTest { public int a ; public String b; private static int c; public  ClassLoaderTest(){ System.out.println("执行前:"+ a + "  "+ b); a = 10; b = "lisi"

Java变量方法初始化顺序

面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量, 构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果.这实际上是在考查我们对于继承情况下类的初始化顺序的了解. 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序以此是 (静态变量.静态初始化块)>(变量.初始化块)>构造器. 我们也可以通过下面的测试代码来验证这一点: 父类--静态变量 父类

Java 类成员的初始化顺序

Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. ? 1 ?无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); } } class Test { static Samp

[转]Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数

Java初始化顺序1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)4,装载子类B后,完成静态动作类装载完成,开始进行实例化1,在实例化子类B时,先要实例化父类A2,实例化父类A时,先成员实例化(非静态代码)3,父类A的构造方法4,子类B的成员实例化(非静态代码)5,子类B的构造方法 先初始化父类的静