C++程序设计必知:生存期

       自然界中的事物都有产生和消亡,都有生存期,程序中的简单变量和类的对象也一样有它们的生存期,它们也会产生和消亡。对象的生存期分为静态生存期和动态生存期两种。什么叫做静态生存期和动态生存期呢?

       1.静态生存期

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

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

       函数内部具有块作用域的对象怎样才能具有静态生存期呢?我们可以使用关键字static修饰对象。比如,static int x;这个语句就是将x声明为具有静态生存期的变量,也成为静态变量。

       2.动态生存期

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

      下面举个例子说明下简单变量和类的对象的生存期,其中涉及到了全局变量和局部变量。

  1.     #include <iostream>
  2.          using namespace std;
  3.          int a=1;           // a为全局变量,它具有静态生存期。
  4.          void fun(void);
  5.          int main()   
  6.          { 
  7.                      static int x;    // 局部变量,具有静态生存期,可以叫做静态局部变量,局部可见。
  8.                      int y=5;         // y,z为局部变量,具有动态生存期。
  9.                      int z=1;
  10.   
  11.                     cout<<"---MAIN---\n";
  12.                     cout<<" a: "<<a<<" x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
  13.                     z=z+2;  
  14.                     fun();
  15.                     cout<<"---MAIN---\n";
  16.                     cout<<" a: "<<a<<" x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
  17.                     a=a+10;
  18.                     fun(); 
  19.                     return 0;
  20.         }
  21.         void fun(void)
  22.         {
  23.                   // x,y为静态局部变量,具有全局寿命,局部可见。只有第一次进入函数时被初始化。
  24.                   static int x=4;
  25.                   static int y;
  26.                   int z=10;   // z为局部变量,具有动态生存期,每次进入函数时都初始化。
  27.                   a=a+20;
  28.                   x=x+3;
  29.                   z=z+4;
  30.                   cout<<"---FUN---\n";
  31.                   cout<<" a: "<<a<<" x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
  32.                    y=x;
  33.         }

       运行结果:
       ---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作为自己的值。

       用时钟类来举一个例子。

  1.          #include <iostream>
  2.          using namespace std;
  3.          class Clock //时钟类声明
  4.         {
  5.         public: //外部接口
  6.                    Clock();
  7.                    void SetTime(int NewH, int NewM, int NewS);   //三个形参均具有函数原型作用域
  8.                    void ShowTime();
  9.                   ~Clock(){}
  10.         private: //私有数据成员
  11.                    int Hour,Minute,Second;
  12.         };
  13.         //时钟类成员函数实现
  14.         Clock::Clock() //构造函数
  15.         { 
  16.                   Hour=0;
  17.                   Minute=0;
  18.                   Second=0;
  19.         }
  20.         void Clock::SetTime(int NewH,int NewM,int NewS)
  21.         { 
  22.                   Hour=NewH;
  23.                   Minute=NewM;
  24.                   Second=NewS;
  25.         }
  26.         void Clock::ShowTime()
  27.         { 
  28.                  cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
  29.         }
  30.         //声明全局对象g_Clock,具有文件作用域,静态生存期
  31.        Clock g_Clock;
  32.        int main() //主函数
  33.        {
  34.                   cout<<"文件作用域的时钟类对象:"<<endl;
  35.                   //引用具有文件作用域的对象:
  36.                   g_Clock.ShowTime();
  37.                   g_Clock.SetTime(10,20,30);
  38.  
  39.                   Clock myClock(g_Clock);    //声明具有块作用域的对象myClock,并通过默认拷贝构造函数用g_Clock初始化myClock
  40.                   cout<<"块作用域的时钟类对象:"<<endl; 
  41.                   myClock.ShowTime(); //引用具有块作用域的对象
  42.                   return 0;
  43.        }

       运行结果:
       文件作用域的时钟类对象:
       0:0:0
       块作用域的时钟类对象:
       10:20:30

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

   


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<bits/stdc++.h> #include<windows.h> using namespace std; int choice; int a=0,b=0,c=0,d=0; int user_input; void S(int Color) { HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hCon,Color); } void wait() { Sleep(100); user_input=getchar(); } void cls() { Sleep(100); system("cls"); } int main(int argc, char *argv[]) { S(172); start:cls(); goto a1; gameover:printf("游戏结束。"); printf("按回车键继续"); user_input=getchar(); goto start; a1:printf("现在游戏开始。"); user_input=getchar(); printf("一天,你正在开飞机经过一片雪山区。"); wait(); printf("忽然你的操作系统失控了,飞机直直地坠入山中。"); wait(); printf("你朝两旁看了看,左边是雪地,右边是树林。而你正前方是悬崖,所以你不得不转弯。\n1-左转。\n2-右转。\n"); s1:wait(); switch(user_input) { case'1':goto a8; case'2':goto a13; default:goto s1; } a2:cls(); printf("你下了飞机,走向树林。"); wait(); printf("过了一会儿,你感到又饿又冷,就喝了一点威士忌,坐下休息。"); wait(); printf("但是,威士忌并没有让你觉得温暖。你只是觉得很冷、很冷。\n"); goto gameover; a3:cls(); printf("你吃了一些果实,还摘了一些放在口袋,想晚一点吃。"); wait(); printf("过了一会儿,你的肚子剧烈的痛起来。这时,你才意识到,果子有毒!\n"); goto gameover; a4:cls(); printf("你是否要继续往隧道里走?\n1-是。\n2-不了。\n"); s4:wait(); switch(user_input) { case'1':goto a18; case'2':goto a22; default:goto s4; } a5:cls(); printf("你能带三件东西下飞机。请选择:\n1-香蕉、打火机、外套。\n2-威士忌、外套、匕首。\n"); s5:wait(); switch(user_input) { case'1':goto a10; case'2':goto a2; default:goto s5; } a6:cls(); printf("你走到了隧道里,隧道里很黑,忽然你被一个东西绊倒了。\n"); wait(); printf("你爬起来,看了看地上的东西,原来是一条麻绳。\n1-捡起来。\n2-置之不理。\n"); s6:wait(); switch(user_input) { case'1':goto a11; case'2':goto a23; default:goto s6; } a7:cls(); printf("你呆在飞机里,感到越来越冷,你不得不离开了飞机。\n"); goto a5; a8:cls(); printf("随着“噗”地一声闷响,你的飞机安全降落在雪地上。"); wait(); printf("你要离开飞机去找东西吗?\n1-离开。\n2-待着。\n"); s8:wait(); switch(user_input) { case'1':goto a5; case'2':goto a7; default:goto s8; } a9:cls(); printf("你走出了隧道,继续走。\n"); wait(); printf("你来到了一个山谷前。"); wait(); printf("要走过去吗?\n1-走。\n2-不走。\n"); s9:wait(); switch(user_input) { case'1':goto a17; case'2':goto a12; default:goto s9; } a10:cls(); printf("你下了飞机,漫无目的地寻找食物。\n"); wait(); printf("你看到了一棵树,树上结着一种你从未见过的果子。\n1-吃一点。\n2-离开。\n"); s10:wait(); switch(user_input) { case'1':goto a3; case'2':goto a15; default:goto s10; } a11:cls(); printf("你捡起了绳子,发现它很长。"); a++; wait(); wait(); goto a22; a12:cls(); printf("你没有走进山谷,而是继续走。\n"); wait(); printf("很快,你就因饥饿死去了。\n"); wait(); goto gameover; a13:cls(); printf("“轰”,你的飞机撞上了树,爆炸了。"); wait(); goto gameover; a14:cls(); printf("你追着飞机跑。但是,飞机比你快太多了,你没有追上。"); wait(); printf("你很累很累,倒在了地上。"); wait(); printf("你死于虚脱。\n"); wait(); goto gameover; a15:cls(); printf("你没有吃果子,而是继续走。你走了很久,来到一个隧道口。\n1-进去。\n2-不进去。\n"); s15:wait(); switch(user_input) { case'1':goto a6; case'2':goto a21; default:goto s15; } a16:cls(); printf("你捞起了很多鱼,找了些树枝,烤了鱼来吃。"); wait(); printf("你觉得好多了。"); wait(); printf("这时,天空中传来嗡嗡的响声。你抬头一看,有飞机!\n1-追着飞机跑。\n2-点篝火。\n"); s16:wait(); switch(user_input) { case'1':goto a14; case'2':goto a20; default:goto s16; } a17:cls(); printf("你走了很久,有些体力不支,于是你把香蕉吃了。"); wait(); printf("你走了很久,来到了一个废弃矿坑边。\n1-探索一下。\n2-离开。\n"); s17:wait(); switch(user_input) { case'1':goto a24; case'2':goto a19; default:goto s17; } a18:cls(); printf("你继续往隧道里走,你感觉呼吸越来越难受。\n"); wait(); wait(); printf("你死于窒息。\n"); wait(); goto gameover; a19:cls(); printf("你来到了一个冰封的湖边。"); wait(); if(a==1) { if(b==1) { printf("你用麻绳织了个渔网,用锤子砸破冰面,试图捞上一些鱼。\n"); wait(); goto a16; } else { printf("你用麻绳织了个渔网,却无法打破冰面。你无奈地望着湖面,绝望地叹了口气。\n"); wait(); printf("你饿死了。\n"); wait(); goto gameover; } } else { if(b==1) { printf("你用锤子砸破了冰面,却没办法捞鱼。你无奈地望着湖面,绝望地叹了口气。\n"); wait(); printf("你饿死了。\n"); wait(); goto gameover; } else { printf("你很想捞鱼,却无法打破冰面,又没办法捞鱼。你无奈地望着湖面,绝望地叹了口气。\n"); wait(); printf("你饿死了。\n"); wait(); goto gameover; } } a20:cls(); printf("你找来许多木头,点燃了篝火。飞机上的人看见了浓烟,降落下来,把你救上了飞机。\n"); wait(); printf("事后,你被送去了医院治疗。\n"); printf("生存成功!\n"); wait(); goto gameover; a21:cls(); printf("你绕过了隧道,继续走。\n"); goto a9; a22:cls(); printf("你要继续走吗?\n1-是。\n2-不了。\n"); s22:wait(); switch(user_input) { case'1':goto a18; case'2':goto a9; default:goto s22; } a23:cls(); printf("你没有捡起绳子。"); wait(); wait(); goto a22; a24:cls(); printf("你找到了一把锤子。\n"); b++; wait(); wait(); goto a19; return 0; }
程序设计教程通常会涵盖编程的基本概念、语法、算法和数据结构等内容。在C/C++语言编程方面,它们是广泛使用的编程语言,可用于开发不同类型的应用程序,从简单的命令行程序到复杂的桌面应用和嵌入式系统。 在程序设计教程中,首先会介绍C/C++语言的基本语法,包括变量、数据类型、运算符、控制结构和函数等。学习者会通过编写简单的程序来理解如何声明变量、使用运算符进行计算、使用条件语句和循环结构来控制程序流程,以及如何定义和调用函数。 接下来,教程会介绍C/C++语言的核心概念,如指针、数组和字符串等。学习者会了解如何使用指针来操作内存地址,如何使用数组来存储和处理多个数据,以及如何处理字符串和字符操作。 在更高级的教程中,会介绍C/C++语言的面向对象编程(OOP)概念,如类、对象、继承和多态等。学习者将学习如何使用类和对象来组织和管理程序,如何使用继承和多态来实现代码的重用和灵活性。 此外,教程还可能包含常用算法和数据结构的介绍,如排序算法、查找算法和链表等。学习者可以学习如何实现这些算法和数据结构,并将其应用于解决实际问题。 总之,在C/C++语言的程序设计教程中,学习者将通过理论和实践相结合的方式,逐步掌握编程的基础知识和技能,从而能够独立开发和维护各种类型的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值