存储类型是对于变量而言的。一方面,它可以反映变量的存储空间的位置,另一方面它可以反映变量的生存期。
c++的存储类型有四种,自动类型、静态类型,寄存器类型和外部类型。
其格式如下:
<存储类型> <数据类型> <变量名>;
1.自动类型
示例:
auto int x;
特点:
1.采用动态分配方式,在栈区分配空间。当超出作用域时,自动释放空间。
2.在函数内或语句内声明时,可省略atuo关键字。
这个类型是我们常用的类型。
2.寄存器类型
示例:
register int x;
特点:
1.将变量放在寄存器内,可以加快运行速度。
2.若寄存器被其它了类型 数据占据,则寄存器类型的数据会自动被当作auto变量。
3.静态类型
静态类型分全局静态和局部静态两种。局部静态变量有两大特点,
1.静态局部变量虽然具有局部变量的作用域,但却有全局变量的生存期。
2.静态局部变量只在第一次执行时进行初始化。
示例:
#include<iostream>
using namespace std;
void count()
{
int i = 0;
static j = 0;
i++;
j++;
cout<<"i = "<<i<<",j = "<<j<<endl;
}
int main()
{
for(int i=0;i<3;i++)
count();
return 0
}
运行结果如下:
i=1,j=1
i=1,j=2
i=1,j=3
4.外部类型
外部变量使用关键字extern来声明。在c++中,只有两种情况下才使用外部变量。
(1).在同一文件中,若变量使用在前,声明在后,则在使用前要声明为外部变量。
(2).当有多个文件组成一个完整的程序,且某一个源文件的变量被其它一个或多个文件引用时,在引用的文件里要用extern对该变量做外部声明。
注意声明与定义的区别,extern定义只能有一个,声明可以有多个。
示例:
/*function.cpp*/
int x = 1;//外部定义,只能有一个
....................
....................
/*function1.cpp*/
extern int x;//外部声明,可以有多个
....................
....................
/*function2.cpp*/
extern int x;//外部声明,可以有多个
....................
....................
如果在某一文件里出现如下:
/*function3.cpp*/
extern int x =2;//外部定义
则会出现重复定义的错误,因为function.cpp和function3.cpp里都对x进行了定义。
实际上,通常我们会将全局变量和全局函数放在一个cpp文件里,而将对应的全局变量和函数的声明放在同名的头文件里,示例:
/*function.h*/
#ifndef _FUNCTION_H_
#define _FUNCTION_H_
extern int X;
extern int Y;
int add(int X, int Y);
#endif
/*function.cpp*/
#include "function.h"
int x = 10;
int y = 20;
int add(int a, int b)
{
return a + b;
}
/*main.cpp*/
#include "Demo.h"
#include <iostream>
using namespace std;
int main()
{
cout << "x = " << x << ", y = " << y << endl;
int c = add(1, 2);
printf("c = 1 + 2 = %d \n", c);
return 0;
}
这样处理之后只需要到用到的地方加入相应的头文件即可,例如上述程序中的function.h,从而避免了在每个文件里进行extern声明。