1. 普通局部变量存储于进程栈空间,使用完毕会立即释放,静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0,并且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。**
示例
#include <iostream>
using namespace std;
void test(void){
static int Sys_Mode = 0;
cout<<"1_out:"<<Sys_Mode<<endl;
Sys_Mode = Sys_Mode + 1;
cout<<"2_out:"<<Sys_Mode<<endl;
}
int main() {
test();
test();
test();
return 0;
}
输出结果:
可以从输出结果中看到:
静态局部变量的效果跟全局变量相似,位于函数体内部的静态局部变量初始化,并不会随着函数调用结束释放内存空间。
2. 全局变量
全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。
普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。
静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。
3.总结
static是一个很有用的关键字,使用得当可以使程序锦上添花。用于本文件的函数要使用static关键字声明,这是一个良好的编码风格。
4.项目中使用案例:
RouteBuildingQuery* RouteBuildingQuery::GetInstance()
{
static RouteBuildingQuery globalRouteInterestPoint;
return &globalRouteInterestPoint;
}
这段代码是一个单例模式的实现,用于获取一个全局唯一的 RouteBuildingQuery
实例。具体来说:
RouteBuildingQuery
类的GetInstance()
方法是一个静态方法。- 在方法内部,定义了一个静态局部变量
globalRouteInterestPoint
,它是RouteBuildingQuery
类的一个对象实例,并且被声明为静态的。 - 每次调用
GetInstance()
方法时,都会返回指向globalRouteInterestPoint
的指针。 - 由于
globalRouteInterestPoint
是静态的局部变量,因此它只会在程序第一次调用GetInstance()
方法时进行初始化,并且在整个程序的生命周期内保持不变。 - 这种方式确保了
RouteBuildingQuery
类的实例始终只有一个,并且可以通过GetInstance()
方法来获取。