C++变量的存储类别与作用域
总结一下C++中变量的存储类别以及变量的作用域。
(1)标示符的存储类别决定了标示符在内存中存在的时间(我们可以理解标示符就是确定一个变量的符号,也就是我们所说的变量名)
二:存储类别
(1)静态存储类别:静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序。
(2)自动存储类别:当变量时自动存储类别时,变量在进入到定义它们的程序快时定义它,在离开它们所在的程序块(作用域)时销毁它,因此成为自动变量。其中关键字auto和register用来声明自动类型的变量,
三:自动存储类型:
(1) 只有在函数中的局部变量才是自动存储类型的,我们在MAIN函数中定义的变量一般都是自动变量,关键字auto可以不写,默认情况局部变量就是自动变量(我们把自动存储类别的变量叫自动变量)如下图:
int a;
int b;
都是自动变量
(2)自动变量还有一种寄存器变量,既使用关键字register,我们把经常被调用的变量声明为寄存器变量,顾名思义,让变量存在于寄存器中,达到更加快速的存储,这个我们了解即可,现在很多编译器带有可以识别频繁使用变量的功能,不需要程序员手动设置。
根据最小特权原则,我们应该定义自动变量。代码应该只被赋予它仅能完成设计任务的权限,无需更多权限。
四:静态存储类别
(1)关键字extern和static用于静态存储类别的变量,静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序,一直存在程序的执行过程,但是:即便是静态变量,也并不意味着这些变量(专业来说叫:标识符),在整个程序都是能用的(或者说是可以访问的),这一点在下面有专门的实例。
(2)对于静态变量,许多被误认为和全局变量一致,这一点是错误的,static变量仅仅在变量的作用范围内可见,而全局变量是在所有地方都可见的,这就是static变量与全局变量的区别,我们要纠正一点:存储类别(存数类型)和变量的作用域是两个独立的问题。
我们应该遵循最小特权原则,不去使用全局变量。
(3)我们解释一下,全局变量和静态变量的区别:全局变量是不显示用static修饰的全局变量,但全局变量默认是静态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
全局静态变量是显示用static修饰的全局变量,作用域是所在的文件,其他的文件即使用extern声明也不能使用。
五:标识符(变量)的作用域
(1) 程序中可以使用标识符的范围成为标识符 的作用域,其中我们称标识符为变量,更加专业。例如:我们在一个语句块中声明了一个局部的变量,那么只能在该语句块中使用该变量。
(2)其中作用域大致分为四个:
l 全局作用域:此变量对于从其声明处到文件结束,都是已知的。
l 局部作用域:一个语句块中声明的变量,其作用域在于该语句块中。
l 函数原型作用域:就是函数的形参列表中。
这里着重标记一下局部作用域:当语句块是嵌套的,并且外层语句块中的一个标识符和内层语句块中的标识符名字一致时,外层语句块中的标识符被隐藏,直到内层语句块结束。
六 注意:
(1)我们应该避免使用全局变量,使用全局变量可能在不需要访问变量时却错误的访问变量,违反最小特权原则。仅用于特定函数中的变量应该声明为那个函数的局部变量,而不是全局变量。
(2)应该避免使用会隐藏在外部作用域中名称的变量名,这可以通过在程序中避免使用相同的标识符。
上述总结说明了变量的类型以及作用域,此时我们举个程序,列举上述出现的情况。如下:
#include<iostream> using namespace std; void use_Global(); //声明函数 void use_Local(); void use_Static_Local(); int a=1; //在函数外定义一个全局的变量 int main() { cout<<"the value of global a in the main function is "<<a<<endl; //<span style="color:#ff0000;">输出全局变量的值,值为 1</span> int a=10; //在MAIN函数中定义一个同名字的局部变量 cout<<"now ,in the main function , local a is "<<a<<endl; //<span style="color:#ff0000;">输出局部变量,此时全局变量被隐藏,此时的输出的值为 10</span> { //在语句块中定义局部变量 int a=7; cout<<"int the scope ,local a is "<<a<<endl; //<span style="color:#ff0000;">输出值为:7</span> } cout<<"local a in the main's outer scope is"<<a<<endl; //<span style="color:#ff0000;">脱离语句块,输出变量,输出值为:10</span> use_Local(); //使用函数,函数中定义一个局部变量 use_Static_Local(); //使用函数,函数中定义一个静态局部变量 use_Global(); //使用函数,函数中使用全局变量 use_Local(); use_Static_Local(); use_Global(); return 0; } void use_Global() { cout<<"\n global a is "<<a<<endl;//<span style="color:#ff0000;">此作用域中,没有定义同名的标识符,所以输出的全局变量,值为10</span> cout<<"enter the use_Global function "<<endl; a++; cout<<"\n global a is "<<a<<" on the exit "<<endl; } void use_Local() { int a=20; cout<<"enter the function use_Local, the a is "<<a<<endl; a++;; cout<<"exit the function use_Local, the a is "<<a<<endl; } void use_Static_Local() { static int a=5; //定义静态变量,函数调用结束后,仍存在,但是仅在此函数中可以调用,脱离此作用域,就不行。 cout<<"enter the function use_Static_Local, the a is "<<a<<endl; a++;; cout<<"exit the function use_Static_Local, the a is "<<a<<endl; }