转自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++提供的四种命名的强制转换操作符的具体功能和用法。 1、const_cast 2、static_cast 3、reinterpret_cast 4、dynamic_cast 这四个操作符的使用方法是相同的,都是cast-name...
细说Linux 细说Linux 细说Linux 细说Linux 细说Linux 细说Linux
细说Windows 7 64 Bit下安装完整版 Visual C++ 6.0详细步骤
广博如四库全书者有之(The C++ Programming Language、C++ Primer),深奥如重山复水者有之(The Annotated C++ Reference Manual, Inside the C++ Object Model),细说历史者有之(The Design and Evolution of ...
C++中内存的动态分配与管理永远是一个让C++开发者头痛的问题,本文通过对C++中内存的动态分配释放的基本原理的介绍,让读者朋友能对C++中的内存的动态分配与释放有较为深入的理解,从而更好驾驭C++程序。 1. 函数...
深奥如重山复水者有之(The Annotated C++ Reference Manual, Inside the C++ Object Model),细说 历史者有之(The Design and Evolution of C++, Ruminations on C++),独沽一味者有之(Polymorphism in C++, ...
不细说C++98的语法和标准库.学习C++11需要有C++98的基础。课程会结合项目代码和标准库源码来讲解。介绍了实际产品开发中常用到的C++11特性和库.项目代码可以通过vs2017和g++编译过.C++11特性是C++20以前更新最多的...
C++游戏源码大全集合,有象棋源码,超级玛丽源码 等等。不细说了
本书顺应Android软/硬件、云计算整合潮流,详细剖析了NDK开发中涉及的各类问题和解决方案:搭建Android NDK开发环境的每一步细节,开发第一个Android NDK程序,Android NDK中Java与C/C++代码的互相调用,Facade设计...
细说linux pdf 兄弟连(lampbrother)李明linux课程pdf
PHP课件 细说PHP
细说php
Visual C++ 6.0 用户界面制作入门的资料,从如何创建工程开始,细说了Visual C++ 6.0工具用法,介绍简单的界面程序,解释界面控件的使用,教你如何使用Visual C++ 6.0制作界面应用程序,当然没《MFC Windows 程序...
韩顺平细说servlet笔记
Linux学习笔记(强悍总结值得一看),细说linux基础知识,C,C++源码
韩顺平_细说servlet_笔记__完整版
图表细说电子元器件 图表细说电子元器件(全部)图表细说电子元器件(全部)