关于静态数据和动态数据的自我理解

如果对象的生存期与程序的运行期相同,则称它具有静态生存期。
静态变量的特点是,它并不会随着每次函数的调用而产生一个副体,也不会随着函数返回而失效。In other words,当一个函数返回后,下一次再调用时,该变量会保持上次运算后的值。
*****static int i=5;
表示i会被赋予5初始化,但是下次执行该函数时i值不一定为5,并不是每次运算前i的值都重新赋值为5。
若没有给变量初始化
*****eg:static int j;
            则默认j的初始值为0,即被0初始化。
在类的定义中仅仅对静态数据成员进行引用性声明,必须在命名空间作用域的某个地方使用类名限定定义性声明,这时可以初始化。
之所以类的静态数据成员需要在类定义之外再加定义是因为需要以这种方式专门为它们分配空间。非静态数据成员无需以此方式定义,因为它们的空间是与它们所属的对象的空间同时分配的。
eg: 

 
#include <iostream>
using namespace std;
int i=1;       //i为全局变量,具有静态生存期(即 对象的生存期与程序的运行期相同
void other()
{
    static int a=2;      //a,b为静态局部变量,具有全局寿命,局部可见,只第一次进入函数时被初始化
    static int b;
    int c=10;               //c为局部变量,具有动态生存期,每次进入函数时都被初始化
    a=a+2;
    i=i+32;
    c=c+5;
    cout<<"----other----"<<endl;
    cout<<"i="<<i<<"a="<<a<<"b="<<b<<"c="<<c<<endl;
    b=a;
}
int main()
{
    static int a;                 //a为静态局部变量,具有全局寿命,局部可见
    int b=-10;                   //b, c为局部变量,具有动态生存期,每次进入函数时都被初始化     
    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;
 }
 
图片



自我分析:
1、程序都是从主函数开始运行的
第一次打印出main函数中的i,a,b,c
由于a没给初始化,所以a的初值为0,且i为全局变量值为1,在main中定义了b=-10,c=0;
所以第一次打出
&&&i=1 a=0 b=-10 c=0
然后c=c+8
2、然后执行other()
在改函数中静态局部变量a=2,b=0,c=10,
在other()中i=i+32(i为全局变量1)所以i=33,且a=a+2,a=4,c=10+5=15
则第二次打出other()函数中i,a,b,c
&&&i=33,a=4,b=0,c=15
再执行b=a
3、
再执行main函数
&&&i=33,a=0(保留第一次在main中的值0),b=-10,c=8
再执行i=i+10
4、执行other()
此时i=43
则当执行i=i+32后i=75
而此时的啊a=4(保留第一次执行other()后a的值不变)
执行a=a+2后a=6
而b也保留第一次执行other后的值b=a=4
c=10+5=15
则最后执行other()后打印出
&&&i=75,a=6,b=4,c=15
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值