在C++中,名字有作用域,对象有生命周期。
- 名字的作用域是程序文本的一部分,名字在其中可见。
- 对象的生命周期是程序执行过程中该对象存在的一段时间。
形参和函数体内部定义的变量统称为局部变量。仅在函数的作用域内可见,同时局部变量还会隐藏在外层作用域中同名的其他所有声明中。
自动对象
函数体是一个语句块。块构成一个新的作用域,我们可以在其中定义变量。
我们把只存在于块执行期间的对象称之为自动对象。当块的执行结束后,块中创建的自动对象的值就变成未定义的。
形参是一种自动对象。函数开始时为形参申请存储空间,因为形参定义在函数体作用域之内,所以一旦函数终止,形参也就销毁。
我们用传递给函数的实参初始化形参对应的自动对象。
局部静态对象
某些时候,有必要令局部变量的声明周期贯穿函数调用及之后的时间。
可以将局部变量定义为static类型,从而获得这样的对象。
局部静态对象在程序执行的执行路径第一次经过对象定义语句时初始化,并且直到程序终止时才被销毁,在此期间,即使对象所在的函数结束执行也不会对他有影响。
#include <iostream>
using namespace std;
size_t count_calls(){
static size_t ctr = 0; // 调用结束后,这个值仍然有效。
return ++ctr;
}
int main(){
for (size_t i = 0; i != 10; i++){
cout << count_calls() << endl;
}
return 0;
}
这段程序将输出1到10的数字。
在控制流第一次经过ctr的定义之前,ctr被创建并初始化为0,每次调用将ctr加1并返回新值。
每次执行count_calls函数时,变量ctr的值都已经存在并且等于函数上一次退出时的ctr的值。