笔记内容 参考借鉴了 电子工业出版社 王刚 译 的《C++Primer》第5版 P205内容。
读者有兴趣的可以自行浏览原文,想必会有更深的体会和收获。
在C++中,常常提到对象的 作用域 和 生命周期 这两个概念。
通俗来说,作用域就是这个对象的作用范围,在哪个区域内可以使用,到哪里又不能使用,表达的是这个对象名字能不能被使用的程序区间。
生命周期是在程序执行过程中,该对象存在的一段时间,从哪里开始被定义,又到何时会消亡。
局部变量(local variable)就是作用域只有程序的某一部分的变量,相反的,作用在几乎整个程序区间内的变量就叫全局变量。比如在函数体重定义的变量以及函数形参,这些变量都称为局部变量一般来说,这些变量在离开作用域以后就会消亡。
但是有些时候,需要延迟局部对象的生命周期,从而使得该变量可以在函数调用以后还可以使用,或者下一次调用函数时依然可以生效,这就需要用到局部静态对象。
局部静态对象需要在定义的类型前面加上关键字 static,局部静态对象在程序的执行路径上第一次初始化定义后,不会再被初始化定义,直到程序终止才被销毁。
比如,count_calls是一个记录该函数被调用次数的函数,其中加入了一个局部静态变量ctr,其在该函数的调用时,只会初始化一次,而且每次都会继承上一次执行完的结果:
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;cout<< ctr << endl;//错误,ctr是静态局部变量,作用域依然是局部范围,因此无法在外部被使用}return 0;
}
最终打印结果如下:
局部对象在应该进行初始化,如果在函数内的内置类型局部变量没有进行初始化,则会执行默认初始化,这将导致该变量的值是随机的。然而,局部静态对象如果没有显式的初始值,内置类型的局部静态默认初始化的值为0。