在c++中static用在全局和局部有什么区别
在 C++ 中,static
关键字的作用会根据其使用的上下文(全局作用域、局部作用域等)有所不同。我们可以分别讨论它在全局作用域和局部作用域中的不同含义和作用:
1. 在全局作用域中使用 static
当 static
关键字用于全局变量或函数时,它的作用是将该变量或函数的作用域限定为定义它的文件内,也就是说,它使得该变量或函数具有内部链接。
示例:
// file1.cpp
static int x = 10; // 全局静态变量,只能在file1.cpp中访问static void foo() { // 全局静态函数,只能在file1.cpp中调用// do something
}// file2.cpp
extern void foo(); // error: foo is not declared in this scope
-
全局静态变量 (
static
修饰):static
修饰的全局变量在文件外不可见,其他文件中的代码不能访问它。它只在定义它的文件内有效。 -
全局静态函数 (
static
修饰):static
修饰的全局函数同样只在定义它的文件内可见,不能在其他文件中调用。
2. 在局部作用域中使用 static
当 static
用于局部变量时,它的作用是保持该变量的值在多次函数调用之间的持久性。即使函数调用结束,该局部静态变量仍然存在,并且保持上次函数调用时的值。局部静态变量 只会被初始化一次,并且在后续的函数调用中不会重新初始化。
示例:
void foo() {static int x = 0; // 局部静态变量,初始化一次,之后保留其值x++;std::cout << "x = " << x << std::endl;
}int main() {foo(); // 输出 x = 1foo(); // 输出 x = 2foo(); // 输出 x = 3return 0;
}
-
局部静态变量 (
static
修饰):该变量的生命周期与程序的生命周期相同,但作用域仅限于所在的函数内部。它在程序执行时只会初始化一次,并在后续调用时保留上次的值。
3. 总结
-
全局作用域中的
static
:限定变量或函数的作用域仅限于定义它的文件内,其他文件无法访问。 -
局部作用域中的
static
:使局部变量在多次函数调用之间保持其值,不会每次进入函数时重新初始化。
这两种用法的关键区别在于,全局作用域中的 static
控制可见性,而局部作用域中的 static
控制变量的生命周期。
在 C++ 中,全局的 static
变量和局部的 static
变量在初始化和生命周期方面有一些不同。让我们逐步解析这些差异:
1. 全局 static
变量的初始化
-
初始化时机:全局
static
变量是在程序启动时初始化的,也就是在程序执行的初期,由程序的启动例程(通常是由运行时环境负责)完成初始化。-
全局
static
变量是 在程序加载时进行一次性初始化的,且初始化发生在main()
函数开始执行之前。 -
如果没有显式的初始化值,C++ 会将全局静态变量初始化为默认值(如
0
、nullptr
等)。
-
示例:
// 全局静态变量
static int globalVar = 5;int main() {// globalVar 在程序启动时已初始化为5return 0;
}
-
生命周期:全局
static
变量的生命周期与程序的生命周期一致。它从程序开始执行直到程序结束时才会销毁。-
在程序执行期间,
globalVar
变量始终存在,且在程序退出时会被销毁。
-
2. 局部 static
变量的初始化
-
初始化时机:局部
static
变量的初始化发生在 第一次进入其所在的函数时。也就是说,局部静态变量在程序第一次调用包含它的函数时被初始化一次。-
一旦局部静态变量被初始化,它的值会在后续的函数调用中被保留。即使函数多次被调用,局部静态变量的值也不会丢失。
-
示例:
void func() {static int count = 0; // 仅初始化一次count++;std::cout << count << std::endl;
}int main() {func(); // 输出 1func(); // 输出 2func(); // 输出 3return 0;
}
-
生命周期:局部
static
变量的生命周期与全局static
变量类似,它从程序开始直到程序结束才会销毁。但是,它的作用域仅限于其定义的函数内部。-
当程序退出时,局部静态变量会被销毁,但在程序运行期间,它始终存在,并且在函数调用之间保留上次的值。
-
3. 全局和局部 static
变量的主要区别
特性 | 全局 static 变量 | 局部 static 变量 |
---|---|---|
初始化时机 | 程序启动时,初始化一次 | 第一次进入函数时,初始化一次 |
初始化值 | 如果没有显式初始化,默认为 0 等 | 如果没有显式初始化,默认为 0 等 |
作用域 | 限制在定义它的文件内(文件内可见) | 限制在定义它的函数内(函数内可见) |
生命周期 | 程序运行期间一直存在 | 程序运行期间一直存在 |
访问权限 | 仅在定义它的文件内可见 | 仅在定义它的函数内可见 |
4. 全局 static
与局部 static
的生命周期差异
-
全局
static
变量:它的生命周期是从程序启动开始,直到程序退出时销毁。这意味着无论函数调用多少次,这个变量始终存在。 -
局部
static
变量:它的生命周期是与程序的生命周期一致的,但它的作用域仅限于定义它的函数内。局部静态变量只在第一次调用时初始化一次,并且在之后的每次调用中保持其值。
小结
-
全局
static
变量:程序启动时初始化,且生命周期贯穿整个程序运行过程。 -
局部
static
变量:首次进入函数时初始化,且生命周期贯穿整个程序运行过程,但作用域仅限于所在函数。
希望这能帮助你理解全局 static
和局部 static
变量的初始化时机及生命周期的差异!