C++类的构造函数与析构函数调用顺序

代码如下,可通过打印观察构造和析构的顺序

#include <iostream>
using namespace std;

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

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

class C {
public:
    C() {cout << "C constrcutor" << endl; };
    ~C() {cout << "C destrcutor" << endl; };
};

class D {
public:
    D() {cout << "D constrcutor" << endl; };
    ~D() {cout << "D destrcutor" << endl; };
};

void Func()
{
    cout << "enter Func" << endl;
    A* ptrA = new A(); //c2   d1  堆
    B b;               //c3   d2   栈
    static D d;        //c4   d3   全局
    delete ptrA;
    cout << "exit Func" << endl;
    return;
}

C c;                   // c1   d4
int main()
{
    cout << "enter main" << endl;
    Func();
    cout << "exit main" << endl;
    return 0;
}

运行结果:
C constrcutor              C 是全局对象 在 进入main函数之前就被构造
enter main                 
enter Func
A constrcutor			  A 是 func函数内的 指针对象 存在堆内存
B constrcutor             B 是 func函数的 局部对象 存在栈内存
D constrcutor             D 是 函数静态对象  在第一次执行到声明语句时创建
A destrcutor              func函数内delete删除指针操作  -> 回收堆内存,调用析构函数
exit Func                 
B destrcutor             func函数结束->  栈内存被回收,调用析构函数
exit main
D destrcutor             mian函数结束,程序结束  -> 全局区内存回收,后构造的D类  先被析构
C destrcutor                                   -> 全局区内存回收,先构造的C类  后被析构

C++对象的自动生命周期:

1.后创建的先析构
2.全局对象和静态对象在进入main之前创建
3.函数静态对象在第一次执行到声明语句时创建,但是在main结束的时候回收
4.函数自动对象在定义时创建,到定义所在的}即析构
5.临时对象在当前语句执行完成后即析构 除非赋值给引用变量而延长生命周期

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值