C++ 静态变量

2025年6月14日 | 阅读 7 分钟

在 C++ 中,静态变量 是一种生命周期贯穿整个程序执行的变量,但其作用域可以根据其定义位置进行限制。我们最近讨论了 static 关键字如何改变变量的行为,它确保了变量的值在定义它的块或函数执行完毕后仍然存在。

当我们需要保存一个公共属性或跟踪多个对象之间的共享数据时,静态变量非常有用。它们有助于减少冗余,并在所有实例之间实现更大的一致性。

C 静态变量示例

让我们通过一个例子来说明 C 中的静态变量。

示例

编译并运行

输出

Account Holder Name: Joseph, Balance: $50000
Account Holder Name: John, Balance: $40000
Account Holder Name: Mary, Balance: $20000
Total Bank Accounts Created: 3

说明

在这个例子中,我们定义了一个 tpointTech 类来表示一个银行账户,以及一个名为 total_accounts 的静态变量,它用于跟踪创建的账户总数。当创建一个 tpointTech 对象时,构造函数会设置账户信息并增加 total_accounts,这个变量被所有实例共享。在创建了三个账户并展示了它们的信息后,程序使用静态变量来计算创建的账户总数。

C++ 中静态变量的类型

有几种静态变量,也可以分为三个基本类别:

  • 函数内部的静态变量
  • 类中的静态成员变量
  • 全局静态变量

函数内部的静态变量

在 C++ 中,当一个变量在函数内部被声明为 static 时,它的值在 successive 调用函数时会被保留。通常,局部变量在函数开始时创建,在函数结束时销毁。然而,一个静态局部变量仅在第一次调用函数时初始化,并且其生命周期直到程序结束。每次 successive 调用函数时,都会看到该静态变量的最新修改值。

C++ 函数内部静态变量示例

让我们通过一个例子来说明 C++ 函数内部的静态变量。

示例

编译并运行

输出

Count is: 1
Count is: 2
Count is: 3

说明

在这个程序中,我们有一个 display() 函数,其中包含一个静态变量 c,它只初始化一次并保留其值,跨函数调用。每次调用 display() 函数时,c 都会增加一并打印。因此,运行 display() 函数三次将依次产生输出 1、2 和 3。

类中的静态成员变量

当一个变量在类中被指定为 static 时,它属于类而不是特定的对象。这意味着类的所有实例都使用相同的静态变量。静态成员在类外部初始化,并且独立于其任何对象而存在。

C++ 类中的静态成员变量示例

让我们通过一个例子来说明 C++ 类中的静态成员变量。

示例

编译并运行

输出

Total objects created are: 3

说明

在这个例子中,我们有一个 tpointTech 类,其中包含一个静态成员 object_count 函数,用于跟踪已创建的类的对象数量。之后,每次调用构造函数时都会更新 object_count 函数。在 main() 函数中创建了三个对象(a、b 和 c)。

全局静态变量

在 C++ 中,当一个全局变量在程序中用 static 关键字声明时,它的作用域仅限于源文件。这意味着该变量不能从其他文件中访问。它也有助于封装,并有助于隐藏实现细节,防止在具有多个源文件的大型程序中出现命名冲突。

C++ 全局静态变量示例

让我们通过一个实例来演示 C++ 中的全局静态变量。

示例

编译并运行

输出

Connecting to database... 
Connection count: 1
Connecting to database... 
Connection count: 2
Database connection closed. 
Remaining connections: 1

说明

在此示例中,我们使用全局静态变量 db_connection_count 来模拟一个简单的数据库连接跟踪器。之后,每次调用 ConnectToDatabase() 函数都会增加计数,而 CloseDatabaseConnection() 函数会减少计数,确保只关闭活动的连接。最后,输出将依次显示连接和断开连接的过程。

C++ 中静态变量的存储

在 C++ 中,静态变量用于在程序生命周期中只分配一次内存,并且它在函数调用之间保留其值。与存储在栈上的局部变量不同,静态变量主要存储在称为数据段的特殊内存区域。

如果静态变量在程序中被显式初始化,则其值存储在已初始化数据段中。如果它在程序中没有被显式初始化,它将被自动设置为 0 并放入 BSS(Block Started by Symbol)段,该段包含未初始化的静态或全局变量。这意味着静态变量使用的内存将保留整个程序,无论它们被定义的函数或作用域是否已结束。

C++ 中静态变量的应用

C++ 中静态变量的几个应用如下:

  • 在函数调用之间保留状态:静态变量会在对同一函数的 successive 调用之间存储其值。这使得函数能够“记住”先前调用中发生的情况,并将该信息应用于当前执行。
  • 将作用域限制在函数或文件中:在函数或文件中声明的静态变量在内部链接。这意味着它无法从函数或文件外部访问,这有助于逻辑封装并防止命名冲突。
  • 类中高效的内存使用:类的静态数据成员由所有实例共享。当多个对象使用相同的数据时,只创建一个副本,从而优化了内存使用。
  • 统计类的实例数量:静态变量通常用于显示类的对象创建了多少个,因为所有实例都共享它们,并且可以在不需要对象的情况下进行更新。
  • 实现单例模式:静态变量在单例设计模式中很重要,因为它们存储了类的单个实例,并在程序期间重复使用。

C++ 静态变量选择题

1) 在 C++ 中,定义在函数内的静态变量的生命周期是多久?

  1. 直到函数终止。
  2. 直到对象被销毁。
  3. 直到程序结束。
  4. 这取决于作用域。
 

答案:c) 直到程序结束。


2) 下列哪个选项正确地在 C++ 类中声明了一个静态变量?

  1. int static count;
  2. static int count = 0;
  3. int count static;
  4. count static int;
 

答案:a) int static count;


3) 下列哪个选项显示了 C++ 中全局静态变量的作用域?

  1. 仅限类
  2. 整个程序
  3. 声明它的文件
  4. 仅限主函数。
 

答案:c) 声明它的文件


4) 在 C++ 中,当一个静态变量在函数内部初始化时?

  1. 程序结束后
  2. 仅初始化一次,在第一次函数调用时
  3. 在编译时
  4. 每次调用函数时
 

答案:b) 仅初始化一次,在第一次函数调用时


5) 在 C++ 中,如果一个静态变量在未初始化之前被访问会发生什么?

  1. 它会自动获得垃圾值
  2. 它会导致运行时错误
  3. 它会抛出编译错误
  4. 它默认初始化为零
 

答案:d) 它默认初始化为零


下一个主题C++ 模板特化