`

细说C++全局变量、局部变量和静态局部变量【转】

 
阅读更多

 

转自http://see.xidian.edu.cn/cpp/biancheng/view/61.html

全局变量和局部变量

在函数这一章节中,我们说过函数体内声明的变量仅在该函数体内有效,别的函数是无法使用的。并且在函数运行结束后,这些变量也将消失了。我们把这些在函数体内声明的变量称为局部变量(Local Variable)

然而,可能会遇到这样的问题:我们想要创建一个变量作为数据缓冲区(Buffer),分别供数据生成、数据处理和数据输出三个函数使用,三个函数都要能够读取或修改这个变量的值。显然通过传递参数或返回值来解决这个问题是非常麻烦的。

那么,我们能否建立一个变量能够让这三个函数共同使用呢?在C++中,我们可以在函数体外声明一个变量,它称为全局变量(global variable)所谓全局,是指对于所有函数都能够使用。当然,在该变量声明之前出现的函数是不知道该变量的存在的,于是也就无法使用它了。另外,如果我们声明了一个全局变量之后没有对它进行初始化操作,则编译器会自动将它的值初始化为0

下面,我们就用全局变量来实现刚才提出的那个问题:(程序11.1.1)
#include "iostream.h"
#include "stdlib.h"//用于产生随机数,不必理会
#include "time.h"//用于产生随机数,不必理会
#include "iomanip.h"//用于设置域宽
void makenum();
void output();
void cal();
int main()
{
   srand(time(NULL));//用于产生随机数,不必理会
   for (int i=0;i<4;i++)
   {
      makenum();//产生随机数放入缓冲区
     cal();//对缓冲区的数进行处理
      output();//输出缓冲区的数值
   }
   return 0;
}
int buffer;//定义全局变量,以下函数都能使用它
void makenum()
{
   cout <<"Running make number..." <<endl;
   buffer=rand();//把产生的随机数放入缓冲区
}
void cal()
{
   cout <<"Running calculate..." <<endl;
   buffer=buffer%100;
}
void output()
{
   cout <<"Running output..." <<endl;
   cout <<setw(2) <<buffer <<endl;
}

运行结果:
Running make number...
Running calculate...
Running output...
48
Running make number...
Running calculate...
Running output...
47
Running make number...
Running calculate...
Running output...
24
Running make number...
Running calculate...
Running output...
90
以上为某次运行得到的随机结果。可见,使用全局变量使得多个函数之间可以共享一个数据,同时从理论上实现了函数之间的通讯。 

静态局部变量

全局变量实现了函数之间共享数据,也使得变量不再会因为某个函数的结束而消亡。但是,新问题又出现了:一个密码检测函数根据调用(用户输错密码)的次数来 限制他进入系统。如果把调用次数存放在一个局部变量里,显然是不可行的。虽然全局变量可以记录一个函数的运行次数,但是这个变量是被所有函数共享的,每个 函数都能修改它,实在很危险。我们现在需要的是一个函数运行结束后不会消失的,并且其他函数无法访问的变量。

C++中,我们可以在函数体内声明一个静态局部变量(Static Local Variable)。它在函数运行结束后不会消失,并且只有声明它的函数中能够使用它。声明一个静态局部变量的方法是在声明局部变量前加上static,例如:
    static int a;
和全局变量类似,如果我们没有对一个静态局部变量做初始化,则编译器会自动将它初始化为0。

下面,我们就用静态局部变量来模拟一下这个密码检测函数的功能:(程序11.1.2)
#include "iostream.h"
#include "stdlib.h"
bool password();//密码检测函数
int main()
{
   do
   {
   }
   while (password()!=true);//反复检测密码直到密码正确
   cout <<"欢迎您进入系统!" <<endl;
   return 0;
}
bool password()
{
   static numOfRun=0;//声明静态局部变量存放函数调用次数
   if (numOfRun<3)
   {
      int psw;
      cout <<"第" <<++numOfRun <<"次输入密码" <<endl;
      cin >>psw;
      if (psw==123456)
      {
         return true;
      } 
      else
      {
         cout <<"密码错误!" <<endl;
         return false;
      }
   }
   else
   {
      cout <<"您已经输错密码三次!异常退出!" <<endl;
      exit(0);//退出程序运行
   }
}
第一次运行结果:
第1次输入密码
111111
密码错误!
第2次输入密码
222222
密码错误!
第3次输入密码
0
密码错误!
您已经输错密码三次!异常退出!

第二次运行结果:
第1次输入密码
000000
密码错误!
第2次输入密码
123456
欢迎您进入系统!

使用静态局部变量可以让函数产生的数据更长期更安全地存储。如果一个函数运行和它以前的运行结果有关,那么一般我们就会使用静态局部变量。

分享到:
评论

相关推荐

    细说C++类型转换操作符

     下面我们来看看C++提供的四种命名的强制转换操作符的具体功能和用法。  1、const_cast  2、static_cast  3、reinterpret_cast  4、dynamic_cast  这四个操作符的使用方法是相同的,都是cast-name...

    细说Windows 7 64 Bit下安装完整版 Visual C++ 6.0详细步骤

    细说Windows 7 64 Bit下安装完整版 Visual C++ 6.0详细步骤

    细说C++中的new与delete

    C++中内存的动态分配与管理永远是一个让C++开发者头痛的问题,本文通过对C++中内存的动态分配释放的基本原理的介绍,让读者朋友能对C++中的内存的动态分配与释放有较为深入的理解,从而更好驾驭C++程序。  1. 函数...

    《细说PHP》

    比如变量声明、基本的数据类型、运算符、流程控制(包括条件语句和循环语句)、数组、函数等。这些基础知识是编写PHP程序不可或缺的部分。对于初学者来说,正确理解这些基础概念对于日后学习高级知识至关重要。 ...

    细说PHP源码

    6. **函数与作用域**:函数定义、参数传递、局部和全局变量的作用域,以及静态变量和引用的使用。 7. **字符串与正则表达式**:PHP中字符串处理函数的实现,正则表达式的匹配算法,以及模式匹配在实际应用中的技巧...

    C++高级应用完整版

    《C++高级应用完整版》是一份详尽的C++学习资源,涵盖了C++语言的高级特性和实际应用。这份资料旨在帮助开发者深入理解C++的精髓,提升编程技巧和解决问题的能力。以下将针对该资源中的关键知识点进行详细阐述。 1....

    细说Android 4.0 NDK编程 源码

    《细说Android 4.0 NDK编程 源码》这本书深入探讨了在Android平台上进行原生代码开发的关键技术和实践。NDK(Native Development Kit)是Google为开发者提供的一套工具,允许他们在Android应用中集成C和C++代码,以...

    《细说Android 4.0 NDK编程》PDF

    1. **本地库编译**:通过NDK,开发者可以将C/C++代码编译为动态或静态库,然后在Android应用中调用。这使得开发者能利用已有的C/C++代码库,或者编写高效的算法和数据处理模块。 2. **JNI接口**:Java Native ...

    C++11语言特性和标准库-第一部

    不细说C++98的语法和标准库.学习C++11需要有C++98的基础。课程会结合项目代码和标准库源码来讲解。介绍了实际产品开发中常用到的C++11特性和库.项目代码可以通过vs2017和g++编译过.C++11特性是C++20以前更新最多的...

    细说PHP第二版高洛峰.7z

    - 文件上传:涉及 `$_FILES` 超全局变量和 `move_uploaded_file()` 函数。 - 目录操作:`mkdir()` 创建目录,`rmdir()` 删除空目录,`scandir()` 列出目录内容。 6. PHP面向对象编程(OOP): - 类的定义:`...

    Linux学习笔记(强悍总结值得一看),细说linux基础知识,C,C++源码.zip

    Linux学习笔记是一个全面涵盖Linux操作系统基础、C语言和C++编程源码的综合学习资源。这份资料对于初学者和有经验的开发者来说都是一个宝贵的参考资料,它深入浅出地介绍了Linux系统的核心概念和操作,同时也提供了C...

    细说Android4.0NDK编程.pdf

    本书顺应Android软/硬件、云计算整合潮流,详细剖析了NDK开发中涉及的各类问题和解决方案:搭建Android NDK开发环境的每一步细节,开发第一个Android NDK程序,Android NDK中Java与C/C++代码的互相调用,Facade设计...

    高洛峰php细说php4

    《细说PHP》开发Web应用程序PHP是最理想的工具,易于使用、功能强大、成本低廉、高安全性、开发速度快且执行灵活。 《细说PHP》以实用为目标设计,包含PHP开发最主流的各项技术,对每一个知识点都进行了深入详细的...

    《细说PHP》光盘源码

    首先,我们可以从这个压缩包中探索PHP的基础知识,例如变量的声明和使用,数据类型(如字符串、整型、数组、布尔型和浮点数)的处理,以及流程控制结构(如条件语句if-else和switch-case,以及循环语句for、while和...

    《细说php》光盘源码

    《细说PHP》是一本深度解析PHP编程语言的书籍,其光盘源码包含了书中所有实例和示例的完整代码,对于学习和深入理解PHP有着极高的价值。这份源码的特点在于注释详尽,可以帮助读者更好地理解每段代码的功能和实现...

    细说php精要版

    《细说PHP精要版》是一本专注于PHP编程语言的核心概念和实用技术的书籍,它为初学者和有经验的开发者提供了深入理解PHP的关键知识点。PHP作为一种广泛应用于Web开发的服务器端脚本语言,它的精要版旨在浓缩其精华,...

    兄弟连细说Linux PDF 文档

    兄弟连 细说Linux PDF文档。共12个按章节总结

    细说php16-20章

    在这一章,你将学习如何启动、设置和销毁PHP会话,理解`session_start()`、`$_SESSION`超全局变量以及`session_regenerate_id()`的作用。你还将了解如何存储和读取会话数据,以及设置会话过期时间。 通过深入学习...

    PHP课件 细说PHP345

    PHP课件 细说PHP

Global site tag (gtag.js) - Google Analytics