在C++语言中, 名字有作用域, 对象有生命周期
-
名字的作用域是程序文本的一部分, 名字在其中可见
-
对象的生命周期是程序执行过程中该对象存在的一段时间
-
形参和函数体内部定义的变量统称为局部变量, 它对函数而言是"局部"的, 仅在函数的作用域内可见, 同时局部变量还会隐藏在外层作用域中同名的其他所有声明中.
自动对象
- 只存在于块执行期间的对象称为自动对象, 当块的执行结束后, 块中创建的自动对象的值就变成未定义的了.
- 形参是一种自动对象.
局部静态对象
- 有必要令局部变量的生命周期贯穿函数调用及之后的时间, 可将局部变量定义成
static
类型从而获得这样的对象. - 局部静态对象在程序的执行路径第一次经过对象定义的语句时初始化, 并且直到程序终止时才被销毁, 在此期间即使对象所在的函数结束执行也不会对它有影响. 例子如下:
// 定义计数函数
size_t count_calls(){
static size_t ctr = 0; //局部静态变量ctr
return ctr++;
}
// 定义错误的计数函数
size_t wrong_count_calls(){
size_t ctr = 0; //自动对象ctr
return ctr++;
}
int main(){
// 调用正确的计数函数
for(size_t i = 0; i <= 10; i++){
cout << count_calls() << endl;
}
// 调用错误(未使用局部静态变量)的计数函数
for(size_t i = 0; i <= 10; i++){
cout << wrong_count_calls() << endl;
}
// cout << ctr << endl; // 此行会报错!
return 0;
}
输出如下
执行完成,耗时:0 ms
0
1
2
3
4
5
6
7
8
9
10
0
0
0
0
0
0
0
0
0
0
0
- 若局部静态变量没有显式的初始值, 他将执行值初始化, 内置类型的局部静态变量初始化为
0
.