对象的生存期

 

    ·概念:对象从产生到结束的这段时间就是它的生存期。在对象生存期内对象将保持它的值,直到被更新为止。对象的生存期可以分为静态生存期和动态生存期两种

 

 一、  静态生存期

 

·概念:如果对象的生存期与程序的运行期相同,则称它具有静态生存期。

 

  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具有静态生存期,与程序的运行期相同之外,其余都具有动态生存期。

 

 

01-15 03:45