变量的作用域
变量的作用域是指变量的使用范围。
根据变量的使用范围不同,C++中的变量被分为局部变量和全局变量。
局部变量
在一个函数内或复合语句内定义的变量称为局部变量(函数的形参也属于局部变量)
局部变量只允许在其定义的函数或复合语句中使用,离开所在的函数或复合语句后该局部变量将不能使用
- 例1
主函数中定义的变量也不能在其它函数中使用
int main()
{
int sum = 0;
sum = f(10);
cout << sum << endl;
return 0;
}
int f(int n)
{
for(int i=1; i<= n; i++)
{
sum += i;
}
return sum;
}
注意:
在函数f中,不能使用主函数中的sum变量,它属于主函数的局部变量
- 例2
复合语句中定义的变量,也只能在该复合语句中使用
int main()
{
int i=1, j=3;
cout << i << " ";
i++;
{
int i = 0;
i+= j*2;
cout << i << j << endl;
}
cout << i << ', ' <<j << endl; // 1, 6, 3, 2, 3
}
注意:
复合语句中定义的变量,也只能在该复合语句中使用
- 例3
for 语句中控制变量的作用域
int main()
{
int a[] = {34, 56, 23, 41, 33}
int x;
cin >> x;
for(int i=0; i<5; i++)
{
if(x==a[i])
break;
}
if(i<5) // i use error
cout << "已经找到,下标为:" << i << endl;
else
cout << "未找到!" << endl;
return 0;
}
注意:
编译系统通常将循环语句中定义的变量作为局部变量处理,
因此该变量在循环外是不能使用的
说明:局部变量是在执行该函数或复合语句时自动建立,
当该函数或复合语句执行完毕后将自动释放。所以在不同
的函数或复合语句中定义同名的局部变量,也不会相互干
扰。
全局变量
- 全局变量说明于所有函数之外,可以为所有函数共同使用
- 全局变量可以在各个函数之间建立数据的传输通道。局部变量也称为自动类型变量
例子
int a = 3, b = 5;
int max(int a, int b)
{
return a>b ? a:b;
}
int main()
{
int a = 8;
cout << max(a, b) << endl; // 8
cout << max(::a, b) << endl; // 5
return 0;
}
注意
在函数中,当局部变量与全局变量同名时,遵循“局
部变量优先”的原则。这时,如果想使用全局变量,应在变
量名前加上作用域运算::
即可。
使用用全局变量的几点说明:
- 全局变量的作用范围是从定义点到整个源程序的结束。在定义点之前,如果其它函数要引用全局变量,可以在该函数中用 extern 对全局变量进行声明。
- 使用全局变量,可以增加函数间的直接联系,减少函数定义时的参数
- 由于全局变量在整个程序运行中始终占用内存,这样,使用全局变量将降低程序的通用性、可靠性和移植性,这是全局变量的负面作用
变量的存储类型
不同的变量所分配的存储区域也不同,这就是变量的存储类型。
- C++程序运行时使用的内存区域
- 变量的存储类型
变量的存储类型是变量在内存中存储的方式,根据变量的存储类型,可以知道变量的作用域和生存期。这里,介绍4个存储类型,分别是 - auto(自动类)
- register(寄存器类)
- static(静态类)
- extern(外部类)
在c++中定义一个变量的完整形式是:
<存储类型> <数据类型> <变量名>
自动变量-用auto修饰(默认的定义方式)
例如:
定义一个局部变量i。
auto int i;
与 int i;
是相同的
说明:
自动变量在其定义块(函数或复合语句)开始执行时分配空
间,在块执行结束时释放空间。所以自动变量的生命期开始于块的执行,终止于块的结束
寄存器变量-用register修饰
将尽可能存放在CPU的寄存器中,以提高程序的运行效率
注意
仅局部变量和形参可作为寄存器变量
静态变量-用static修饰
- 静态变量分配在全局数据区中,定义时系统将提供默认的初始值
- 静态变量在编译时分配存储空间,在整个程序执行结束后释放存储空间。所以,静态变量具有全局生命期
- 根据声明的位置不同,静态变量又分为静态局部变量和静态全局变量
- 静态局部变量是在“块”中定义的静态变量。它具有局部作用域,却有全局生命期。在“块”执行结束后,该静态局部变量并不释放(其值依旧存在),以便下次调用时可继续使用。
外部变量-用extern修饰
如果在一个源文件中定义的全局变量要在其它源文件中使用,则在使用前应该用extern进行声明,表示该全局变量不是在本文件中定义的。
例:
在1.cpp文件中定义全局变量
int Dimension=100;
如果在2.cpp文件中使用,这时,应在2.cpp文件中声明如下:
extern int Dimension;
静态全局变量:
全局变量可以在其它源文件中使用。如果在全局变量前加上static修饰符,则成为静态全局变量。静态全局变量只能在本文件中使用
例如:
函数调用计数器,使用静态局部变量统计某个函数被调用的次数
void fun()
{
static int n =0; // 局部静态变量, 第一次调用时候赋值为0,之后都是按照之前的数值计算
// int n = 0; // 每次输出都是1
n++;
cout << "本函数被调用了" << n << "次" << endl;
}
int main()
{
int i;
for(i=1; i< 3; i++)
{
fun();
}
fun();
return 0;
}