static关键字的作用:用来控制变量的存储方式和可见性。
1. 全局静态变量
- 静态变量都在全局数据区分配内存,包括局部静态变量。
- 未经初始化的全局静态变量会被程序自动初始化为0。(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0)
- 全局静态变量在声明它的整个文件都是可见的,而在文件之外是不可见的。
优点:在其他文件中可以定义相同名字的变量,不会发生冲突。
全局变量和全局静态变量的区别:
-
- 全局变量默认具有外部链接性,作用域是整个工程。在一个文件内定义的全局变量,在另一个文件中,通过extern全局变量的声明,就可以使用全局变量。
- 全局静态变量作用域是声明此变量所在的文件,其他的文件即使使用extern关键字声明也不能使用。
2. 局部静态变量
- 静态局部变量在全局数据区分配;
- 静态局部变量在程序执行到该对象的声明处时被首次初始化,以后的函数调用不再进行初始化;
- 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
- 全局静态变量始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间。
静态局部变量也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。
3. 静态函数
- 在函数返回类型前加static,函数就定义为静态函数。
- 函数的定义和声明在默认情况下都是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
- 静态函数只在本cpp内使用,不会同其他cpp中的同名函数起冲突。
4. 类的静态成员
静态成员属于整个类而不是某个对象,静态成员只存储一份供所有对象共用。静态成员可以使用双冒号老使用即<类名>::<静态成员名>。
5. 类的静态函数
静态函数属于类的静态成员,不是对象成员。因此,对静态成员的引用不需要用对象名。
- 不能通过类名来调用类的非静态成员函数。通过类的对象调用静态成员函数和非静态成员函数。
- 类的对象可以使用静态成员函数和非静态成员函数
- 静态成员函数不能引用非静态成员。因为静态成员函数属于整个类,在类实例化之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,相当于没有声明一个变量却提前使用它一样。
- 类的非静态成员函数可以调用静态成员函数。
- 类的静态成员变量必须先初始化再使用。