面试题答案
一键面试生命周期
使用 static
关键字修饰的局部变量,其生命周期从程序开始执行时分配内存,直到程序结束才释放内存,而不是像普通局部变量那样,在函数调用结束时就销毁。
作用域
作用域依然是定义该变量的函数内部,与普通局部变量作用域相同。即只能在定义它的函数内部访问,函数外部无法访问。
初始化
只会在第一次进入定义该变量的函数时进行初始化,后续再进入该函数时,不会再次初始化,而是使用上次函数调用结束时的值。
示例代码
#include <iostream>
void testFunction() {
// 普通局部变量
int normalVar = 1;
// static修饰的局部变量
static int staticVar = 1;
normalVar++;
staticVar++;
std::cout << "Normal Variable: " << normalVar << std::endl;
std::cout << "Static Variable: " << staticVar << std::endl;
}
int main() {
for (int i = 0; i < 5; ++i) {
testFunction();
}
return 0;
}
在上述代码中,testFunction
函数内定义了一个普通局部变量 normalVar
和一个 static
修饰的局部变量 staticVar
。每次调用 testFunction
,normalVar
都会重新初始化为 1
然后自增,而 staticVar
只会在第一次调用 testFunction
时初始化为 1
,后续调用不再初始化,直接在上次自增后的基础上继续自增。运行 main
函数中的循环,会清晰看到两者表现的差异。