zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    在Lufylegend中如何设置bitmap或者sprite的缩放和旋转中心
    面试必备:文本框与按钮的最简组合
    JavaScript设计模式之策略模式(学习笔记)
    JavaScript设计模式之观察者模式(学习笔记)
    Canvas transform浅析
    JavaScript ArrayBuffer浅析
    IE8-下背景色半透明滤镜在jquery动画中失效问题记录
    JQuery__Tab实践
    memoization提升递归效率
    es6--箭头函数
  • 原文地址:https://www.cnblogs.com/xiezhw3/p/4356311.html
Copyright © 2011-2022 走看看