您的位置:首页 > 编程语言 > C语言/C++

C++编程入门系列之十九(C++程序设计必知:生存期)

2016-10-10 22:49 239 查看
上一讲鸡啄米讲的是作用域与可见性,今天鸡啄米给大家讲讲生存期。

       自然界中的事物都有产生和消亡,都有生存期,程序中的简单变量和类的对象也一样有它们的生存期,它们也会产生和消亡。这一讲中鸡啄米用对象来统一表示简单变量和类的对象。对象的生存期分为静态生存期和动态生存期两种。什么叫做静态生存期和动态生存期呢?下面将分别讲解。

       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具有静态生存期外,其余均有动态生存期。

       我们通过学习这个例子,复习了类的声明、类成员函数的实现、类构造函数和拷贝构造函数的使用作用域和可见性,还有本讲的生存期等知识点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐