【C++】static关键字有哪些用法?其主要作用是什么?
static关键字的用法:
1)将全局变量修饰为静态全局变量
存储在静态存储区,整个程序运行期间一直存在
静态全局变量在声明它的文件之外是不可见的,只要声明它的文件可见,而普通的全局变量则是所有文件可见
2)将局部变量修饰为静态局部变量
存储在静态存储区
作用域仍为局部作用域,但是当局部变量离开作用域之后,并没有销毁,而是仍然存储在内存中,只不过目前暂时不能对它进行访问,直到该函数再次被调用,并且值不变,只会被初始化一次
#include<stdio.h>
int fun()
{
static int count = 10; //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,a
return count--; //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:
}
int count = 1;
int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
/*
程序运行结果:
global local static
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
*/
3)将普通函数修饰为静态函数
静态函数只在声明它的文件中可见,所以不会同其他cpp中的同名函数引起冲突
4)将类的成员变量修饰为静态成员变量
静态成员变量是属于类的,而不是属于对象的,静态成员变量可以实现多个对象之间的数据共享,并且静态成员变量还不会破坏隐藏的原则,对多个对象来说,静态成员变量只存储一处,供所有对象共用
5)将类的成员函数修饰为静态成员函数
静态成员函数同样是属于类的,而不是属于对象,需要注意的是在静态成员函数的实现中不可以直接引用类中的非静态数据成员,但是可以直接引用静态成员,如果非要引用非静态的成员,则可以通过对象来引用
static关键字的作用:
1)作用域隐藏
当编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,static可以用作函数和变量的前缀,对函数来讲,static的作用仅限于隐藏
2)保持变量内容的持久
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一一次初始化
3)默认初始化为0(static变量)
4)静态成员函数和静态成员变量是属于类的,所有对象只有一份拷贝,所以不能将静态函数设置为虚函数(虚函数是来实现多态的,静态成员属于类而非对象,没有多态的概念)