c++ 类的构造顺序

单继承的情况下,父类构造先于子类,子类析构先于父类,例:

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

class B : public A {
public:
    B() {
        cout << "B" << endl;
    }
    ~B() {
        cout << "~B" << endl;
    }
};

结果为:

A
B
~B
~A

多继承的情况下,此时的构造顺序在满足单继承构造顺序要求的情况下,出现了两个同级父类的构造顺序问题。在这个时候,对于同级父类,构造顺序是根据继承列表从左往右的。析构顺序相反。

class A {
public:
    A() {
        cout << "A" << endl;
    }
    ~A() {
        cout << "~A" << endl;
    }
};
class B{
public:
    B() {
        cout << "B" << endl;
    }
    ~B() {
        cout << "~B" << endl;
    }
};

class C : public B, public A {
public:
    C() {
     cout << "C" << endl;
    }
    ~C() {
        cout << "~C" << endl;
    }
};

输出:

 

B
A
C
~C
~A
~B

类中包含类对象的情况下的构造顺序:

class A {
public:
    A() {
        cout << "A" << endl;
    }
    ~A() {
        cout << "~A" << endl;
    }
};
class B : public A {
public:
    B() {
        cout << "B" << endl;
    }
    ~B() {
        cout << "~B" << endl;
    }
};
class C : public B, public A {
public:
    C() {
        cout << "C" << endl;
    }
    ~C() {
        cout << "~C" << endl;
    }
};
class D : public B {
public:
    D() {
        cout << "D" << endl;
    }
    ~D() {
        cout << "~D" << endl;
    }
private:
    C c;
    A a;
};

输出结果为:

A  // D 继承 B,B 继承 A,所以顺序为 A, B 
B
A  // 定义 C 的对象,C 继承顺序中第一个是 B,B 继承 A,所以是 A, B
B
A  // C 继承顺序中的第二个
C  // C 的定义
A  // D 中参数 A
D
~D
~A
~C
~A
~B
~A
~B
~A

类内声明

class D {
public:
    D(int a) {
        cout << "D: " << a << endl;
    }
};

class M {
public:
    M() {
        cout << 'M' << endl;
        extern D d;
    }
};

上面的写法不报错,因为没有进行对象的定义,只有对象的声明。所以不需要调用D的构造函数。

 

包含 static 变量

class M {
public:
    M() {  
        cout << 'M' << endl;
    }
private:
    static D d;
};

在不进行 static 对象的定义的情况下,进行 M 对象的定义是不报错的,因为没有用到 D 类的构造函数。也即是 d 只进行了声明没有进行定义。

多区段下构造成员顺序

class A {
public:
    A() {
        cout << "A" << endl;
    }
    ~A() {
        cout << "~A" << endl;
    }
};
class B{
public:
    B() {
        cout << "B" << endl;
    }
    ~B() {
        cout << "~B" << endl;
    }
};
class D {
private:
    A a;
    B b;
public:
    D() {
        cout << "D" << endl;
    }
    ~D() {
        cout << "~D" << endl;
    }
private:
    B b2;
    A a2;
};

输出结果:

A
B
B
A
D
~D
~A
~B
~B
~A

就像上述代码,不管交换访问区还是访问权限,始终都是按照从上到下的顺序进行构造.

原文地址:https://www.cnblogs.com/xiezhw3/p/4356311.html