&&&&&& 大家十一玩的高兴吗?可能大家都旅游散心去了,没有那么多时间跟着鸡啄米的教程学习了,但是鸡啄米再加班给大家写写教程吧。上一讲鸡啄米讲的是作用域与可见性,今天鸡啄米给大家讲讲生存期。
&&&&&& 自然界中的事物都有产生和消亡,都有生存期,程序中的简单变量和类的对象也一样有它们的生存期,它们也会产生和消亡。这一讲中鸡啄米用对象来统一表示简单变量和类的对象。对象的生存期分为静态生存期和动态生存期两种。什么叫做静态生存期和动态生存期呢?下面将分别讲解。
&&&&&& 1.静态生存期
&&&&&&&若某个对象它的生存期与程序的运行期相同,我们就说它具有静态生存期,就是说在程序运行期间它都不会释放。
&&&&&& 具有文件作用域的对象都具有静态生存期。
&&&&&& 函数内部具有块作用域的对象怎样才能具有静态生存期呢?我们可以使用关键字static修饰对象。比如,static int x;这个语句就是将x声明为具有静态生存期的变量,也成为静态变量。
&&&&&& 2.动态生存期
&&&&& &除了上述情况的对象具有静态生存期外,其余对象都具有动态生存期。具有动态生存期的对象产生于声明处,于该对象的作用域结束处释放。
&&&&&& 鸡啄米给大家举个例子说明下简单变量和类的对象的生存期,其中涉及到了全局变量和局部变量,这两个概念下一讲会讲到。现在大家可以先这样简单的理解,全局变量就是具有文件作用域的变量,局部变量就是具有块作用域的变量。
&&&&&&&& #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;
&&&&&& &}
&&&&& &运行结果:
&&&&&& ---main---
&&&&&& a: 1 x: 0 y: 5 z: 1
&&&&& &---fun---
&&&&& &a: 21 x: 7 y: 0 z: 14
&&&&&& ---main---
&&&&& &a: 21 x: 0 y: 5 z: 3
&&&&&& ---fun---
&&&&& &a: 51 x: 10 y: 7 z: 14
&&&&&& 这里要说明下,静态局部变量如果没有进行显式初始化,那么它将被默认初始化为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;
&&&&&& }
&&&& & 运行结果:
&&&&&& 文件作用域的时钟类对象:
&&&&&& 0:0:0
&&&& &&块作用域的时钟类对象:
&&&&&& 10:20:30
&&&&&& 这个程序中定义了具有各种作用域的对象,clock类声明中,settime函数声明的三个参数具有函数原型作用域,数据成员具有类作用域,全局对象g_clock具有文件作用域,对象myclock具有块作用域。除g_clock具有静态生存期外,其余均有动态生存期。
&&&&&& 我们通过学习这个例子,复习了类的声明、类成员函数的实现、类构造函数和拷贝构造函数的使用、作用域和可见性,还有本讲的生存期等知识点。
&&&&&& 鸡啄米今天就讲到这了,最后祝大家假期愉快!
&