在《C++PrimerPlus》一书中说C++变量有三种特性,分别是:持续性、作用域和链接性。但是按我的理解,我觉得应为两种特性:持续性和作用域。持续性就是变量在内存中保存的时间;作用域(scope)描述了变量在多大的范围内可见。至于书中所说的链接性(描述了该变量能不能在不同文件间共享,链接性为外部的变量可在文件间共享,没有链接性的变量则不可),即能否在其他文件中使用该变量,也可归为作用域。
按这两种属性的不同,变量可以分为如下几种:
1 持续性:自动变量,作用域:代码块
使用如下:
int main()
{
int temp = 0;
for(int i = 0;i < 10;i++)
temp++;
...
return 0;
}
在以上代码中,temp就是自动变量(当然i也是),它持续性直到代码块运行结束从内存中释放,作用域是它所在的代码块。
值得一提的是,自动变量如果在子代码块中也有定义,则越是局部定义的变量越具有优先使用的特性。
int main()
{
int temp = 0;
int i = 10;
for(int i = 0;i < 10;i++)
temp++;
...
return 0;
}
在上面的代码中,for语句前面定义的i会因为for语句定义的i而在for语句中隐藏,在这个子代码块中优先使用子代码块定义的变量。
2 寄存器变量
寄存器变量比较特殊,它建议编译器使用CPU内部的寄存器来存储自动变量,使用关键字register定义,持续时间以及作用域和1型变量相同。(但在C++11中已经没有此用法,还作为关键字存在更多是为了兼容以前的程序)
用法如下:
register int count_fast;
3 持续性:静态 作用域:代码块
使用方法如下:
int fun(int x);
int main()
{
int temp1 = 10;
int temp2 = 5;
fun(temp1);
...
fun(temp2);
...
return 0;
}
int fun(int x)
{
static int num = 0;
for(int i = 0;i < x;i++)
num++;
}
在以上代码中num是作用域为fun函数代码块的一个static变量,num只能在fun函数中使用,它和没有关键字static的变量区别是:num只在第一次调用fun时把num初始化成0,当fun不运行时num也在内存中保存,下次调用时num不再执行初始化语句,直接使用上次调用后保留的值。
4 持续性:静态 作用域:当前文件
使用如下:
//file1
static int temp = 20;
...
//file2
int temp = 7;
...
若使用此种变量,必须在函数外部定义,不能定义于任意一个代码块之内,关键字static的使用使temp只限定于当前文件使用,不能被其他文件所使用,file2中的定义不会影响file1中temp的值。
5 持续性:静态 作用域:所有工程下的文件
定义方法:
//file1
extern int number1 = 20;
int number2 = 30;
...
在其他文件中使用这两个变量:
//file2
extern int number1;
extern int number2;
...
同样的,需要把这个类型的变量定义到函数外边,在定义中关键字extern不是必须的,number2在file2中同样可以使用。但是在file2中声明全局变量时必须用关键字extern。另外,全局变量必须在定义的时候进行初始化,在file2中声明外部全局变量时不能同时对变量赋值,编译器会认为是定义了两个重名的变量而报错。