细说C++全局变量、局部变量和静态局部变量
2020-05-23 14:28:40
供稿:网友
我们已经在前面学习了变量,并且能够熟练地使用它。可是,仅仅靠这些知识,有些问题仍然无法得到解决。
标志符
首先要来介绍一下什么是标志符。在程序设计的过程中,经常要给变量、函数甚至是一些数据类型起名字(还包括以后的类名,对象名等)。我们把这些用户根据一些规定,自己定义的各种名字统称为标志符(Identifier)。显然,标志符不允许和任何保留字相同。
全局变量和局部变量
在函数这一章节中,我们说过函数体内声明的变量仅在该函数体内有效,别的函数是无法使用的。并且在函数运行结束后,这些变量也将消失了。我们把这些在函数体内声明的变量称为局部变量(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
欢迎您进入系统!
使用静态局部变量可以让函数产生的数据更长期更安全地存储。如果一个函数运行和它以前的运行结果有关,那么一般我们就会使用静态局部变量。