2025_1_26 c++中关于构造和析构的顺序

时间:2025-01-27 21:12:46

1.构造和析构的顺序

有以下代码:

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:
    C(){
        cout << "C()" << endl;
    }
    ~C(){
        cout << "~C()" << endl;
    }
};
class D{
public:
    D(){
        cout << "D()" << endl;
    }
    ~D(){
        cout << "~D()" << endl;
    }
};

C c;
int main(){
    A a;
    B b;
    static D d;

    return 0;
}

输出结果为:

C()
A()
B()
D()
~B()
~A()
~D()
~C()

构造顺序

  • 全局对象: 全局对象 C c 在程序启动时构造。
  • 自动对象: 自动对象 A a 和 B b 在 main 函数的作用域内按声明顺序构造。
  • 静态对象: 静态对象 static D d 在 main 函数第一次执行到该对象时构造。

析构顺序

  • 自动对象: 自动对象 B b 和 A a 在 main 函数结束时按声明的逆序析构
  • 静态对象: 静态对象 static D d。在程序结束时析构。
  • 全局对象: 全局对象 C c 在程序结束时析构。

总结

  • 全局对象:在程序启动时构造,在程序结束时析构。 (最早和最晚

  • 自动对象:在作用域内按声明顺序构造,在作用域结束时按声明的逆 序析构。(声明是顺序,析构时逆序

  • 静态对象:在第一次执行到该对象时构造,在程序结束时析构。(执行到时构造,程序结束时析构,但析构的时间晚于全局对象