对象的生存期
数据的共享与保护机制是C++的重要特性之一。提到了数据的共享,我们就需要来分析一下C++中对象的生存期。
生存期,顾名思义,就是从诞生到结束的这段时间。
对象的生存期分为静态生存期和动态生存期。
一、静态生存期
当对象的生存期与程序的运行期相同时,称对象具有静态生存期。
在命名空间作用域中声明的对象都是具有静态生存期。
在局部作用域中声明具有静态生存期的对象,就要使用关键词static。
局部作用域中的静态变量的特点:是不会随着函数调用的结束二消亡;也就是静态变量每次调用间共享。
二、动态生存期
动态生存期的范围就比较广泛,除了两种静态生存期的对象外都具有动态生存期,也称局部生存期对象。
局部生存期对象诞生于声明点,结束于声明所在的块执行完毕时。

为了更好的理解静态生存期和动态生存期,我用一个比较简单的代码让大家了解具体的生存期的特点。
...

#include<iostream>
using namespace std;
int i = 1;                              //i为全局变量,具有静态生存期
void other()
{
    static int a = 2;                   //a为静态局部变量,赋值初始化
    static int b;                       //b为静态局部变量,不赋值
    int c = 10;                         //c为局部变量,具有动态生存期
    a += 2;
    i += 32;
    c += 5;
    cout << "---OTHER---" << endl;
    cout << "i:" << i << "a:" << a << "b:" << b << "c:" << c << endl;
    b = a;
}

int main()
{
    static int a;
    int b = -10;
    int c = 0;
    cout << "--MAIN---" << endl;
    cout << "i:" << i << "a:" << a << "b:" << b << "c:" << c << endl;
    c += 8;
    other();
    cout << "--MAIN---" << endl;
    cout << "i:" << i << "a:" << a << "b:" << b << "c:" << c << endl;
    i += 10;
    other();
    return 0;
}

...
设置变量的想法
我设置了两种具有静态周期的变量,但一个进行赋值,另一个仅定义,对比a和b的结果,观察变化
另外设置一个具有动态周期的变量,将a与c进行结果对比。
运行结果如图一

正如我们了解的,每一次重新调用other函数的时候,a和b的初值没有发生变化,主函数运行的时候,其中的静态常量也没有发生任何变化,都是最初的值,并且我发现,没有赋值的静态常量b,初值是0,所以也就证明
定义时未指定初值的基本类型静态变量,会赋予0初始化;
动态变量也只是在局部作用域中起到作用。
三、实例验证
相信都已经基本了解了静态对象与局部生存期对象的特性,接下来用一个更加复杂的例子完善对对象生存期的理解。
...

#include<iostream>
using namespace std;
class Clock
{
public:
    Clock();
    void setTime(int newH, int newM, int newS)
    {
        hour = newH;
        minute = newM;
        second = newS;
    }
    void showTime()
    {
        cout << hour << ":" << minute << ":" << second << endl;
    }

private:
    int hour, minute, second;
};
Clock::Clock() : hour(0),minute(0),second(0){}
Clock globCLOCK;
int main()
{
    cout << "First time output :" << endl;
    globCLOCK.showTime();
    globCLOCK.setTime(8, 30, 30);
    Clock myClock(globCLOCK);
    cout << "Second time output: " << endl;
    myClock.showTime();
    return 0;
}

...
运行结果如图二

这是一个时钟程序,更加清楚的反应了静态和动态生存期对象的特性。

01-23 05:33