在C++语言中,变量的存储类共有如下四种: (1)auto存储类 (2)static存储类 (3)extern存储类 (4)register存储类
1. auto存储类
auto存储类,即自动存储类。在函数内部定义的变量,如果不指定其存储类,那么它就是auto类变量。
void func( )
{
int a;
auto int b;
…
}
//a和b都是auto存储类变量
自动类变量是在动态存储区中分配存储单元的,当函数返回时,自动类变量中存放的数据也就消失了。
在变量初始化方面,自动类变量在每调用一次函数时都要赋一次初值,且自动类变量的默认初值不确定。
2. static存储类
static存储类,即静态存储类。如果某一对象或变量被指定为static存储类,则在程序执行过程中,此对象或变量总是存在。这样,即使函数调用结束以后,其静态对象或静态变量仍不消失,仍然保持其数值。
在函数内部定义静态变量时,需要在定义变量的类型说明符的前面加上static关键字,在函数外面定义的对象或变量,即使其前面没有static,也是静态存储类;如果在函数外面定义的变量(即全局变量)其前面加上static,则称为静态外部变量,静态外部变量的作用域仅仅局限在该变量所定义的文件中,而在其它文件中是不能访问的。
void test_static( )
{
static int vs=0;
cout << "static=" << vs << '\n';
++vs;
}
void main( )
{
int i;
for (i=0; i<4; i++)
test_static( );
}
/*执行结果 :
static=0
static=1
static=2
static=3
*/
静态存储类对象或变量是在静态存储区中分配存储单元的,因此在函数调用结束时,它的值并不消失。
在变量初始化方面,静态变量是在编译过程中赋初值的,且只赋一次初值。
3. extern存储类
extern存储类,即外部存储类。如果在一个文件中要引用另一个文件中定义的外部变量,则在此文件中应用extern关键字把此变量说明为外部的。
extern int a; //a为别的文件中定义的外部变量
void func( )
{
a=100;
……
}
外部变量的定义和说明:
大型程序为了易于维护和理解,通常需要把程序划分为多个文件来保存,每个文件都可以单独编译,最后再把多个文件的编译结果(即目标文件)连接到一起来生成一个可执行程序。这种情况下,如果在一个文件中需要引用另一个文件中的外部变量,就需要利用extern说明。
(1)外部变量的定义
int mydata; //外部变量的定义
void func( )
{
……
}
(2)外部变量的说明
extern int mydata; //外部变量的说明
void main ( )
{
……
}
4. register存储类
register存储类,即寄存器存储类。为了提高某些自动类变量或函数参数的处理速度,可以在定义这些变量的类型说明符的前面加上register关键字,以通知编译系统为这些变量分配寄存器来存放其值。
void test_r(register int n)
{
register char c;
…
}
//register int n;可以简写为 register n;
实际可用的寄存器数受硬件特性的限制,所以并不是所有寄存器变量都能够保存在寄存器中。
能够说明为寄存器类变量的数据类型是有限制的,一般常用的有char、int、short int和unsigned int等。