变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式。函数
1)动态存储方式的变量,生存期为变量所在的做用域。即程序运行到此变量时才为其分配存储空间,做用域结束时,会自动收回为其分配的存储空间。this
2)静态存储方式的变量,生存期为整个程序执行的过程。即程序开始时就为其分配存储空间,程序结束时,才会收回为其分配的存储空间。spa
4种变量的存储类型:指针
1)自动类型(auto):动态存储方式的变量,局部变量,auto经常省略。code
2)寄存器类型变量(register):动态存储方式的变量,编译器不为此类型变量分配存储空间,而是直接使用CPU的寄存器。存取速度快,主要用于控制循环次数等不须要长期保存值的变量。对象
3)外部类型变量(extern):静态存储方式的变量,系统自动初始化值,又叫全局变量,全局变量是从做用域提出的,外部变量是从存储方式提出的,表示了它的生存期。blog
4)静态存储变量(static):静态存储方式的变量,系统自动初始化值,静态变量只能在它的做用范围内使用。作用域
static:静态存储变量的类型说明符。编译器
static局部变量:在函数内的局部变量类型说明符前加上static说明符就构成静态局部变量。局部变量变为静态局部变量,即改变了它的生存期。it
void Fun() { static int i; //static局部变量 ... }
1)static局部变量在函数内定义。
2)static局部变量的生存期是整个程序。
3)static局部变量的做用域为函数体内。但再次调用定义此函数时,又可继续使用此变量,并且保存了前次被调用后留下的值。
int Fun1() { int i = 0; //局部变量 i++; return i; } int Fun2() { static int i; //static局部变量 i++; return i; } int main(int argc, char* argv[]) { int iRet = 0; iRet = Fun1(); //iRet = 1; iRet = Fun1(); //iRet = 1; iRet = Fun2(); //iRet = 1; iRet = Fun2(); //iRet = 2; return 0; }
static全局变量:在全局变量类型说明符前加上static就构成静态的全局变量。全局变量变成静态全局变量,即改变了它的做用域。
1)当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量要在其它的源文件中使用,在使用前就用extern进行外部声明。
2)若是在一个源文件中定义的外部变量不想让其它源文件使用,则必须声明为static全局变量,只能供所在的源文件使用。同时能够避免在其它源文件中引发错误。
//全局变量 file1.cpp int gNum; main() { gNum++; } file2.cpp extern int gNum; main() { gNum++; } //static全局变量 file3.cpp static int gNum; main() { gNum++; }
static类成员变量:类的全部对象都用同一个static成员变量。经过对象名或类名均可以调用。
class A { public: static int x; int y; }; A a1,a2; //建立了两个A的对象 a1.x = 1; //A::x = 1;或a2.x = 1;同样,都是对static int x;操做,x = 1; a1.y = 1; //a1对象里面y = 1; a2.y = 2; //a2对象里面y = 2;
static类成员变量和普通数据成员同样,不能在类的定义体中初始化,只能在类外进行初始化。但static const却能够。
int y = 200; class A { public: static const int x = 100; static int y; };
static类成员函数:类的全部对象都用同一个static成员函数。经过对象名或类名均可以调用。
1)static类成员函数没有this指针。
2)static类成员函数不能被声明为const和虚函数。
3)static类成员函数能够访问所属类的static成员变量,但不能使用非static成员变量。
class A { public: static int x; int y; static void Fun(); //static成员函数 }; static void Fun() { x++; //能够 y++; //不能够 } A a1; a1.Fun(); //或A::fun();