对象的生存期
·概念:对象从产生到结束的这段时间就是它的生存期。在对象生存期内对象将保持它的值,直到被更新为止。对象的生存期可以分为静态生存期和动态生存期两种。
一、 静态生存期
·概念:如果对象的生存期与程序的运行期相同,则称它具有静态生存期。
1. 这种生存期与程序的运行期相同。在文件作用域中生命的对象具有这种生存期。在函数内部声明静态生存期对象,要冠以关键字static。
2. 写法:
static int i;
注:此时定义的变量i便是具有静态生存期的变量,也称为静态变量。
也可赋初值:
static int i = 5;
3.
① 静态变量的特点:
它不会随着每次函数调用而产生一个副本,也不会随着函数返回而失效。即使发生了递归调用,第n次调用函数时,静态变量的值为第n-1次调用静态变量的值。(也就是说:静态变量第一次赋值有效,也只能赋值一次。)
② 定义时未指定初值的基本类型静态生存期变量,会被赋予0值初始化,而对于动态生存期变量,不指定初值意味着初值不确定。
③ 全局变量为静态变量,局部变量一般为动态的。
④ 类的对象成员也有各自的生存期,不用static修饰的成员对象,其生存期与它们所属对象的生存期保持一致。
代码:
1 #include <iostream> 2 using namespace std; 3 4 int i = 1; //i为全局变量,具有静态生存期 5 int main() 6 { 7 static int a; //a为静态局部变量,具有全局寿命,局部可见 8 int b = -10; //b,c为局部变量,具有动态生存期 9 int c = 0; 10 11 void other(void); 12 13 cout << "-----MAIN------" << endl; 14 cout << "i=" << i << " a=" << a << " b=" << b << " c=" << c << endl; 15 16 c = c + 8; 17 other(); 18 cout << "-----MAIN-------" << endl; 19 cout << "i=" << i << " a=" << a << " b=" << b << " c=" << c << endl; 20 21 i = i + 10; 22 other(); 23 return 0; 24 25 } 26 27 void other(void) 28 { 29 //a,b为静态局部变量,具有全局寿命,局部可见,只第一次进入函数是被初始化 30 static int a = 2; 31 static int b; 32 33 int c = 10; 34 a = a + 2; 35 i = i + 32; 36 c = c + 5; 37 38 cout << "-----OTHER-----" << endl; 39 cout << "i=" << i << " a=" << a << " b=" << b << " c=" << c << endl; 40 b = a; 41 42 }
运行结果:
二、 动态生存期
·概念:块作用域中生命的,没有用static修饰的对象是动态生存期的对象。(习惯称为局部生存期对象)
1. 诞生于声明点,结束于命名该标识符的作用域结束处。(声明所在的块执行完毕之时)
2. 具有静态、动态生存期对象的时钟程序:
1 #include <iostream> 2 3 using namespace std; 4 5 class Clock 6 { 7 public: 8 Clock(); 9 void SetTime(int NewN, int NewM, int NewS); 10 void ShowTime(); 11 ~Clock() {} 12 private: 13 int Hour, Minute, Second; 14 }; 15 16 Clock::Clock() 17 { 18 19 } 20 21 void Clock::SetTime(int NewN, int NewM, int NewS) 22 { 23 Hour = NewN; 24 Minute = NewM; 25 Second = NewS; 26 } 27 28 void Clock::ShowTime() 29 { 30 cout << Hour << ":" << Minute << ":" << Second << endl; 31 } 32 33 Clock globClock; 34 35 int main(int argc, char* argv[]) 36 { 37 38 cout << "First Time Output:" << endl; 39 40 globClock.ShowTime(); 41 globClock.SetTime(8, 10, 15); 42 Clock myClock(globClock); 43 44 cout << "Second Time Output:" << endl; 45 myClock.ShowTime(); 46 return 0; 47 }
运行结果:
注:就生存期而言,除了具有命名空间作用域的对象globGlock具有静态生存期,与程序的运行期相同之外,其余都具有动态生存期。