C++编程入门(二) 互动版

对象生存期

所谓对象的生存期,是指对象从被创建到被释放的存在时间,也就是对象的寿命。按照对象的生存期和作用域的不同,可分为三类。

## 局部对象

定义在一个函数体或程序块内。当程序执行到对象定义的地方是,调用构造函数,创建该对象。当程序执行完整个函数体或持续块时,调用析构函数,对象被释放。局部对象作用域小,生存期短。

## 全局对象

定义在函数体或程序块外。程序一开始执行时,就调用构造函数,创建该对象,直到程序运行结束时调用析构函数,该对象被释放。全局对象作用域大,生存期长,但安全性较差。

## 静态对象

在定义对象时,前面加关键字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。