生存期

生存期

自然界中的事物都有产生和消亡,都有生存期,程序中的简单变量和类的对象也一样有它们的生存期,它们也会产生和消亡。

用对象来统一表示简单变量和类的对象。对象的生存期分为静态生存期和动态生存期两种。

静态生存期

若某个对象它的生存期与程序的运行期相同,我们就说它具有静态生存期,就是说在程序运行期间它都不会释放。

具有文件作用域的对象都具有静态生存期。

函数内部具有块作用域的对象怎样才能具有静态生存期呢?我们可以使用关键字static修饰对象。

比如,static int x;这个语句就是将x声明为具有静态生存期的变量,也成为静态变量。

动态生存期

除了上述情况的对象具有静态生存期外,其余对象都具有动态生存期。具有动态生存期的对象产生于声明处,于该对象的作用域结束处释放。

全局变量就是具有文件作用域的变量,局部变量就是具有块作用域的变量。

#include <iostream>
using namespace std;
int a=1;          // a为全局变量,它具有静态生存期。
void fun(void);
int main()
{
    static int x;   // 局部变量,具有静态生存期,可以叫做静态局部变量,局部可见。
    int y=5;        // y,z为局部变量,具有动态生存期。
    int z=1;
    
    cout<<"---MAIN---\n";
    cout<<" a: "<<a<<" x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
    z=z+2;
    fun();
    cout<<"---MAIN---\n";
    cout<<" a: "<<a<<" x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
    a=a+10;
    fun();
    return 0;
}

void fun(void)
{
  // x,y为静态局部变量,具有全局寿命,局部可见。只有第一次进入函数时被初始化。
    static int x=4;
    static int y;
    int z=10;   // z为局部变量,具有动态生存期,每次进入函数时都初始化。
    a=a+20;
    x=x+3;
    z=z+4;
    cout<<"---FUN---\n";
    cout<<" a: "<<a<<" x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
    y=x;
}

在这里插入图片描述
这里要说明下,静态局部变量如果没有进行显式初始化,那么它将被默认初始化为0。当第二次进入fun函数时,其静态局部变量x和y将不再初始化,x和y将继续使用fun函数第一次被调用后最后的值来参加下面的运算。

具体点说,第一次调用完fun函数后,fun中变量x的值是7,在第二次调用fun函数时,x不会被赋值为4,而是继续使用7作为自己的值。

再用时钟类来给大家一个例子,让大家回想温习下以前和本讲的一些知识。

#include <iostream>
using namespace std;
class Clock //时钟类声明
{
public: //外部接口
    Clock();
    void SetTime(int NewH, int NewM, int NewS); //三个形参均具有函数原型作用域
    void ShowTime();
    ~Clock(){}
private: //私有数据成员
    int Hour,Minute,Second;
};

//时钟类成员函数实现
Clock::Clock() //构造函数
{
    Hour=0;
    Minute=0;
    Second=0;
}
void Clock::SetTime(int NewH,int NewM,int NewS)
{
    Hour=NewH;
    Minute=NewM;
    Second=NewS;
}
void Clock::ShowTime()
{
    cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
}

//声明全局对象g_Clock,具有文件作用域,静态生存期
Clock g_Clock;

int main() //主函数
{
    cout<<"文件作用域的时钟类对象:"<<endl;
    
    //引用具有文件作用域的对象:
    g_Clock.ShowTime();
    g_Clock.SetTime(10,20,30);
    
    Clock myClock(g_Clock);  //声明具有块作用域的对象myClock,并通过默认拷贝构造函数用g_Clock初始化myClock
    cout<<"块作用域的时钟类对象:"<<endl;
    myClock.ShowTime(); //引用具有块作用域的对象
    return 0;
} 

在这里插入图片描述
这个程序中定义了具有各种作用域的对象,Clock类声明中,SetTime函数声明的三个参数具有函数原型作用域,数据成员具有类作用域,全局对象g_Clock具有文件作用域,对象myClock具有块作用域。除g_Clock具有静态生存期外,其余均有动态生存期。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光开朗男孩

你的鼓励是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值