首先,必须明白一个程序是包含若干个源文件,每个源文件又是包含若干个函数,每个源文件、函数中又定义了若干个变量。但是每个变量都有自己的作用范围,也就是自己的作用域。只有在作用域内才可以访问变量。
变量的有效范围称为变量的作用域( scope)。归纳起来,变量有4种不同的作用域:文件作用域( file scope)、函数作用域( function scope)、块作用域(block scope)和函数原型作用域( function prototype scope)。文件作用域是全局的,其他三者是局部的。
除了变量之外,任何以标识符代表的实体(如函数、数组.结构体.类等)都有作用域概念,与变量的作用域类似。
局部变量和全局变量
1.局部变量
在一个函数内部定义的变量称之为内部变量(局部变量),只在函数内有效。需要注意的是,函数原型声明中出现的参数名,只在原型声明括号中有效,他并不是实际存在的变量,不能被引用,编译系统对此变量名忽略,即使在调用函数时也不为其分配存储空间。
2.全局变量
在函数外定义的变量是外部变量,称为全局变量,有效范围是从定义点到本源文件结束。需要注意的是尽管全局变量可以增加函数之间的数据交流,但仍然不建议过多使用全局变量,原因如下:
(1)全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。即分配在静态存储区。
(2)它使函数的通用性降低了,因为在执行函数时要受到外部变量的影响。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名,就会出现问题,降低了程序的可靠性和通用性。,
(3)在程序设计中,一般要求把程序中的函数做成一个封闭体,除了可以通过“实参形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个全局变量的值。在各个函数执行时都可能改变全局变量的值,程序容易出错。因此,要限制使用全局变量。
(4)如果在同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽,即它不起作用,此时可以使用局部变量。
变量的存储方式
动态存储方式与静态存储方式
上面讲到的变量的一种属性作用域,作用域是从空间的角度来分析的,分为全局变量和局部变量。变量还有另一一种属性一存储期( storage duration,也称生命期)。存储期是指变量在内存中的存在周期。这是从变量值存在的时间角度来分析的。存储期可以分为静态存储期( static storage duration) 和动态存储期( dynamicstorage duration)。这是由变量的静态存储方式和动态存储方式决定的。
所谓静态存储方式是指在程序运行期间,系统对变量分配固定的存储空间。而动态存储方式则是在程序运行期间,系统对变量动态地分配存储空间。
变量的存储位置
先看一下内存中的供用户使用的存储空间的情况,可以将其分为三部分:
(1)程序区 (2)静态存储区 (3)动态存储区
程序中所用的数据存放在静态存储区与动态存储区中。
全局变量全部存放在静态存储区中,在程序开始执行时就给全局变量分配存储单元,程序执行完毕释放这些空间。程序执行过程中占据固定的空间。
动态存储区中存放:(1)函数形参(2)函数内定义的变量(未加static) (3)函数调用时的现场保护和返回地址等。当函数调用的时候才申请空间,函数执行完立即释放。
变量的存储类别
1.自动存储
函数中的局部变量,不用static声明时,编译系统对其动态分配存储空间。
注意:在复合语句中定义的变量,只在定义时分配空间,复合语句结束时自动释放空间。用关键字auto声明存储类别,使用举例:auto int a; 但是auto可以省略。即默认为自动变量。
2.static声明静态局部变量
(1)静态局部变量在静态存储区内分配存储单元。在程序整个运行期间不释放。
(2)对静态局部变量是在编译时赋初值的,所以只赋一次,在程序运行时就存在初值。以后的对其每次调用使用的是上一次函数结束的值。如果未赋初值,默认为0或空字符。而动态分配的结果不确定。
(3)静态局部变量对其他函数来讲是不可见的。
3.用register声明的寄存器变量
一般情况下,变量的值存放在内存当中。当程序使用到那一个变量的值的时候,由控制器发出指令将内存中该变量的值送到CPU中的运算器,如果结果需要保存,则再送回到内存中。
如果有一些变量使用频繁,比如i在for中循环使用10000次,则存取变量需要花费很多时间。C++允许将局部变量的值放在CPU的寄存器当中,需要时直接从寄存器中取出,因此可以提高执行效率。
但如今的编译系统可以自动识别使用频繁的变量,并将其放入到寄存器当中,所以只需要了解即可。
4. 用extern声明外部变量
(1)在一个文件内声明全局变量
如果外部变量不在开头定义,其有效作用范围只限定于定义位置到文件终了位置。如果定义点之前的函数想要引用该全局变量,则应该在引用之前用关键字extern对该变量作外部变量声明。
eg:
#include<iostream>
using namespace std;
int max(int,int);
int main()
{
externint a,b;
cout<<max(a,b)<<endl;
return 0;
}
int a=15;b=17; //定义全局变量a,b
int max(int x,int y)
{
intz;
z=x>y?x:y;
returnz;
}
(2).在多文件的程序中声明全局变量(外部变量)
如果一个程序包含两个文件,在两个文件中都要用到同一个全局变量num,不能在两个文件中都定义,否则在进行程序的连接时会出现“重复定义”的错误。正确做法是:在任一个文件定义外部变量num,而在另一个文件中对num做外部变量声明。
5.用static声明静态外部变量
当希望外部变量只限于被本文件使用时,而不能被其他文件引用。这是可以在定义外部变量时加一个static声明。
摘抄于 谭浩强 c++程序设计(第三版)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)