对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,知道被更新为止。
静态生存期
这种生存期与程序的运行期相同。
在文件作用域中声明的对象具有这种生存期。
在函数内部声明静态生存期的对象,要冠以关键字static
动态生存期
块作用域声明的对象是动态生存期的对象(习惯称局部生存期对象)
开始与程序执行到声明点时,结束语命名该标识符的作用域结束处。
16
例:
- #include <iostream.h>
- void fun ();
- void main()
- {
- fun();
- fun(); //运行2次
- }
- void fun()
- {
- static int a=1; //第二次运行fun()的时候由于a=1是静态所以不再执行
- int i=5; //i是动态生存期
- a++; //a是静态生存期 第二次运行取的第一次退出时候的值2
- i++;
- cout <<”i=”<<i<<”,a=”<<a<<endl;
- }
运行结果
i=6,a=2
i=6,a=3
这个例子说明静态变量只有在第一次运行的时候才初始化
变量的生存期与可见性
- #include<iostream.h>
- int i=1; //i为全局变量,具有静态生存期
- void main(void)
- {
- static int a; //静态局部变量,有全局寿命,局部可见。
- int b= -10; //b,c为局部变量,具有动态生存期。
- int c= 0;
- void other(void);
- cout <<”---MAIN---/n”;
- cout<<”i:”<<i<<”a:”<<a<<”b:”<<b<<”c:”<<c<<endl;
- c=c+8; other();
- cout <<”---MAIN---/n”;
- cout <<”i:”<<i<<”a:”<<a<<”b:”<<b<<”c:”<<c<<endl;
- i=i+10;other();
- }
- void other(void)
- {
- static int a=2;
- static int b;
- //a,b,为静态局部变量,具有全局寿命,局部可见。
- //只第一次进入函数时被初始化。
- int c=10; //c为局部变量,具有动态生存期。
- //每次进入函数都初始化。
- a=a+2;i=i+32;c=c+5;
- cout<<”—OTHER--/n”;
- cout<<”i:”<<i<<”a:”<<a<<”b:”<<b<<”c:”<<c<<endl;
- b=a;
- }
例:具有静态、动态生存期对象的时钟程序
- #include<iostream.h>
- class Clock //时钟类声明
- {
- public: //外部借口
- Clock();
- void SetTime(int NewH,intNewM,intNewS);
- //三个形参均具有函数原型作用域
- void ShowTime();
- ~Clock(){}
- private:
- int Hour,Minute,Sencond;
- };
- //时钟类成员函数实现
- 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;
- }
- Clock globClock; //声明对象globClock,具有静态生存期,文件作用域
- void main() //主函数
- {
- cout <<””First time output:”endl;
- //引用具有文件作用域的对象globClock:
- globClock.ShowTime(); //对象的成员函数具有类作用域
- globClock.SetTime(8,30,30);
- Clock myClock(globClock); //声明具有块作用域的对象
- myClock
- cout<<”Second time output:”<<endl;
- myclock.ShowTime(); //引用具有块作用域的对象myClock
- }
数据与函数
数据存储在局部对象中,通过参数传递实现共享——函数间的参数传递
方法一:数据存储在全局对象中
例:
- #include <iostream.h>
- int global; //全局的文件作用域,在哪个都能使用
- void f()
- {
- global=5;
- }
- void g()
- {
- cout<<global<<endl;
- }
- int main()
- {
- f();
- g(); //输出5
- return 0l
- }
方法二:将数据和使用数据的函数封装在类里面
例:
- #include<iostream.h>
- class Application
- {
- public:
- void f(); void g();
- private:
- int global; //类作用域
- };
- void Application::f()
- {
- global=5;
- }
- void Application::g()
- {
- cout<<global<<endl;
- }
- int main()
- {
- Application
- MyApp;
- MyApp.f();
- MyApp.g();
- return 0;
- }