“一个人的命运啊,当然要靠自我奋斗,但也要考虑到历史的行程。” ——2009年4月23日在视察中国联合工程公司时的讲话
目录
编辑
前言
static在局部作用域中的作用
给出例子:
修改上面给出的例子:
为什么不使用全局变量,而是使用 static 变量
作用域限制
static在文件作用域中的作用
结束语
总阅读时间约为 10~15分钟。
前言
在编程中,变量的作用域和生命周期是至关重要的概念。我们在函数中定义的局部变量通常在函数执行完毕后销毁,下一次调用时重新初始化。然而,有时我们需要变量在多次函数调用之间保留其值,而不被其他模块轻易访问。这就引出了 static 变量 的重要性。本文将详细解析 static 变量的特点及其在不同场景中的应用,同时对比它与全局变量的优缺点,并通过代码示例说明其作用域的限制。
static在局部作用域中的作用
通常,函数中定义的局部变量在函数作用域结束时消失。当再次调用这个函数时,会重新创建该变量的存储空间,其值会被重新初始化。
给出例子:
#include <iostream>
void example() {
int x = 0; // 每次调用函数都会重新初始化 x 为 0
x++;
std::cout << "x: " << x << std::endl;
}
int main() {
example(); // 输出 x: 1
example(); // 输出 x: 1
example(); // 输出 x: 1
return 0;
}
在这个例子中,每次调用 example,局部变量 x 的值都会从 0 重新开始。
修改上面给出的例子:
如果想使局部变量的值在程序的整个生命期里仍然存在,我们可以定义函数的局部变量为static(静态的),并给它一个初始值。初始化只在函数第一次调用时执行,函数调用之间变量的值保持不变。
#include <iostream>
void example() {
static int x = 0;
x++;
std::cout << "x: " << x << std::endl;
}
int main() {
example(); // 输出 x: 1
example(); // 输出 x: 2
example(); // 输出 x: 3
return 0;
}
在这个例子中,我们定义函数的局部变量 x 为static(静态的),并给它一个初始值,在函数的后续调用中,x 保留上次调用后的值,而不是重新初始化。
为什么不使用全局变量,而是使用 static 变量
作用域限制
全局变量:在整个程序中可访问,任何函数都可以随意读取和修改其值。这种广泛的可见性容易导致意外的修改或难以追踪的错误。
static 局部变量:作用域仅限于定义它的函数,避免了其他代码模块无意间修改或依赖它。这种限制帮助局部化错误,使问题更容易排查。
static在文件作用域中的作用
static的第二层意思和前面的含义相关,即“在某个作用域外不可访问”。当应用static于函数名和所有函数外部的变量时,它的意思是“在文件的外部不可以使用这个名字”。函数名或变量是局部于文件的;我们
说它具有文件作用域(file scope)。例如,编译和链接下面两个文件会引起链接器错误。
File1.cpp
#include <iostream>
int globalVar = 10; // 全局变量,其他文件也可以访问
static int fileStaticVar = 20; // 静态变量,仅限于本文件
void globalFunction() {
std::cout << "This is a global function." << std::endl;
}
static void fileStaticFunction() {
std::cout << "This is a file static function." << std::endl;
}
File2.cpp
#include <iostream>
// 声明 file1.cpp 中的全局变量和函数
extern int globalVar;
extern void globalFunction();
int main() {
std::cout << "Accessing globalVar: " << globalVar << std::endl; // OK
globalFunction(); // OK
std::cout << fileStaticVar << std::endl; // 错误:无法访问 fileStaticVar
fileStaticFunction(); // 错误:无法调用 fileStaticFunction
return 0;
}
编译并链接:
g++ file1.cpp file2.cpp -o program
编译结果说明:
· fileStaticVar 和 fileStaticFunction 是 file1.cpp 的私有实现,不能被 file2.cpp 访问。
· file1PublicFunction 是 file1.cpp 中对外暴露的接口,可以被 file2.cpp 调用。
结束语
通过本文的介绍,我们深入了解了 static 变量在 C++ 中的应用及其与全局变量的不同之处。静态变量不仅可以在函数间保留状态,还能够通过文件作用域限制外部访问,提高模块的安全性和封装性。合理使用 static 变量能够帮助我们在编程中减少错误、提高代码的可维护性。
相关阅读
C/C++ 中 static 的用法全局变量与局部变量 | 菜鸟教程