在c++ 中 static 关键字有几种不同的用途,但通常都与存储期和可见性、链接行有关
1. 静态局部变量
当static用于函数内的局部变量时, 他改变了变量的存储期, 这样的变量在执行过程中只被初始化一次, 并且在函数调用之间保持其值 , 这也就意味着静态局部变量的声明周期从它被初始化直到程序结束 。
void function()
{
static int count = 0 ;
counter++ ;
std::cout<< counter <<std::endl ;
}
每次调用function 时 count的值不会被重置 , 它将保留上一次调用的值 。
2. 静态类成员
static 也可以用于类的成员变量和成员函数
静态成员变量: 不属于类的任何单个实例, 而是类的所有实例共享的数据。 静态成员变量有一个独立的空间,通常用于类的所有对象共享的常量数据或者跟踪类的实例数 。
静态成员函数: 可以不依赖类的实例而被调用, 他们不能访问类的非静态成员, 因为他们不属于任何对象实例
#include <iostream>
class Test {
public:
static int staticvalue ;
static void staticfunction()
{
std::cout << "this is staticvalue " << staticvalue << std::endl;
}
};
int Test::staticvalue = 10; //在类外初始化静态成员变量
int main()
{
Test::staticfunction();
return 0;
}
3.静态全局变量和函数
在文件的全局范围内使用 static 意味着该变量或者函数的链接行变为内部 , 这意味着它只能在定义它的文件进行访问,而不能在其他文件进行访问 。 这将有助于i封装,因为它限制了对静态全局变量或者函数的访问范围
4.为什么static只能初始化一次
在c++ 所有的对象(包括静态变量) 都只能初始化一次 , 而静态变的存储周期比较长 ,一旦初始化之后,没有被销毁 , 就会保存在内存区域之中 ,所以不会被初始化 , 一般是与程序共存亡 , 而auto变量,它是存储在栈区的,一旦函数调用结束后, 就会被销毁 。