代码如下,可通过打印观察构造和析构的顺序
#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.临时对象在当前语句执行完成后即析构 除非赋值给引用变量而延长生命周期