对象生存期
所谓对象的生存期,是指对象从被创建到被释放的存在时间,也就是对象的寿命。按照对象的生存期和作用域的不同,可分为三类。
## 局部对象定义在一个函数体或程序块内。当程序执行到对象定义的地方是,调用构造函数,创建该对象。当程序执行完整个函数体或持续块时,调用析构函数,对象被释放。局部对象作用域小,生存期短。
## 全局对象定义在函数体或程序块外。程序一开始执行时,就调用构造函数,创建该对象,直到程序运行结束时调用析构函数,该对象被释放。全局对象作用域大,生存期长,但安全性较差。
## 静态对象在定义对象时,前面加关键字static。静态对象生存期最长,在程序结束时被释放。定义在函数体外的静态对象,称为外部静态对象,否则是内部静态对象。两者生存期相同,外部静态对象的作用域是文件级的,而内部静态对象的作用域是被定义的函数体或程序块。
#include <iostream>
using namespace std;
class L
{
public:
L(int x){a=x;cout<<"创建,a= "<<a<<endl;}
~L(){cout<<"析构,a= "<<a<<endl;};
void Print(){cout<<"a= "<<a<<endl;}
private:
int a;
};
L l1(1); //全局变量
static L l2(2); //外部静态变量
void func()
{
L l5(5); //局部变量
}
void main()
{
L l3(3); //局部变量
static L l4(4);//内部静态变量
func();
}
输出结果为:
创建,a= 1
创建,a= 2
创建,a= 3
创建,a= 4
创建,a= 5
析构,a= 5
析构,a= 3
析构,a= 4
析构,a= 2
析构,a= 1
程序创建了5个类L的对象。l1和l2定义在函数体外部,分别是全局对象和外部静态对象,程序开始运行就会相继被创建。然后程序进入main函数,创建局部变量l3,然后创建内部静态对象l4,然后调用func时,创建对象l5。这就是前5行输出。
程序执行完func后,l5被释放。然后程序返回主函数,也执行完了,所以先释放局部对象l3,再释放内部静态变量l4,最后释放的是外部静态对象l2和全局对象l1。