C++ static静态变量详解
在 C++ 语言中,static 关键字用于创建静态变量。与普通的局部变量和全局变量相比,静态变量有一些独特的特性和应用场景。
静态变量分两种,一种是函数内的静态变量,一种是全局的静态变量,其特点是变量定义时带有 static 关键字。例如:
局部静态变量存储在全局数据区,只允许初始化一次,但它的生命周期和全局变量一样,自它们被定义时就一直存在,直到程序结束时才会被销毁。
举个简单的例子:
静态全局变量的特点是:变量的作用域仅限于定义它的源文件中,而不是整个项目中的所有源文件。
举个简单的例子:
假设项目中还有一个名为 file.cpp 的源文件:
静态变量在 C++ 编程中具有多种用途,包括维护函数或方法调用之间的状态、限制变量的作用范围以提高封装性,以及在类级别共享数据。正确使用静态变量,能编写出更高效、可维护的代码。
静态变量分两种,一种是函数内的静态变量,一种是全局的静态变量,其特点是变量定义时带有 static 关键字。例如:
static int gVar; // 在函数外,定义全局的静态变量 void myFunction() { static int iVar; // 在函数内,定义局部的静态变量 }
局部静态变量
函数内的静态变量也称为局部静态变量,其作用域只限于函数内部,别的函数不能访问。局部静态变量存储在全局数据区,只允许初始化一次,但它的生命周期和全局变量一样,自它们被定义时就一直存在,直到程序结束时才会被销毁。
举个简单的例子:
#include <iostream> void counter() { static int count = 0; // 静态局部变量 count++; std::cout << "Count: " << count << std::endl; } int main() { counter(); // 输出:Count: 1 counter(); // 输出:Count: 2 counter(); // 输出:Count: 3 return 0; }执行结果为:
Count: 1
Count: 2
Count: 3
static int count=0;
只执行一次,即 count 的值不会被重复地初始化为 0。从运行结果可以看出,count 的值在连续的函数调用之间是累积的。全局静态变量
如果在全局作用范围内使用 static 关键字定义变量,则该变量成为全局静态变量。静态全局变量的特点是:变量的作用域仅限于定义它的源文件中,而不是整个项目中的所有源文件。
举个简单的例子:
// main.cpp #include <iostream> int globalVar = 10; // 全局变量 static int globalStaticVar = 100; // 静态全局变量 int main() { //... return 0; }示例程序位于 main.cpp 源文件中,globalVar 是普通的全局变量,globalStaticVar 是静态全局变量。
假设项目中还有一个名为 file.cpp 的源文件:
-
对于 globalVar 变量,通过在 file.cpp 注明
extern int globalVar;
,我们就可以在 file.cpp 文件中使用 main.cpp 中的这个 globalVar 变量; - 对于 globalStaticVar,由于它是静态全局变量,它的作用域仅限于 main.cpp 文件,因此不允许在 file.cpp 文件中使用。
总结
在 C++ 中,和其它类型的变量相比,静态变量具有以下这些特性:- 生命周期:静态变量从它们被初始化开始一直存在,直到程序结束时才被销毁。
- 访问范围:静态变量的作用范围仅限于它们被定义的函数、代码块或文件中。
- 内存位置:存储在全局数据区。
- 初始化:静态变量只初始化一次。
静态变量在 C++ 编程中具有多种用途,包括维护函数或方法调用之间的状态、限制变量的作用范围以提高封装性,以及在类级别共享数据。正确使用静态变量,能编写出更高效、可维护的代码。