C++ static

2025年4月3日 | 阅读 7 分钟

在 C++ 中,`static` 是一个关键字或修饰符,它属于类型而不是实例。因此,不需要实例即可访问 `static` 成员。在 C++ 中,`static` 可以是字段、方法、构造函数、类、属性、运算符和事件。

C++ 使用 `static` 关键字来实现各种功能,包括延长变量的生命周期和减少作用域的可访问性,同时优化内存管理。`static` 关键字能够控制变量和函数以及类成员的访问,同时管理它们的行为参数。

语法

它具有以下语法:

C++ Static 字段

声明为 `static` 的字段称为 `static` 字段。与每次创建对象时都会获得内存的实例字段不同,`static` 字段在内存中只生成一个副本。它被所有对象共享。

它用于引用所有对象的共同属性,例如 Account 的 `rateOfInterest`、`companyName`、`Employee` 等。

C++ Static 字段示例

让我们看一个 C++ 中 `static` 字段的简单示例。

示例

编译并运行

输出

101 John 7.25
102 Alice 7.25

C++ 使用 Static 关键字统计对象示例

让我们再举一个 C++ 中 `static` 关键字的例子,它用于统计对象数量。

示例

编译并运行

输出

101 John
102 Alice
103 Michael
103 Michael
Total Objects are: 4

在这里,我们将讨论可以在 C++ 中使用的几个 `static` 函数。

1. 函数中的 Static 变量

在 C++ 中,`static` 变量在函数执行之间保持确定的值,避免了连续的初始化。函数中的 `static` 变量只初始化一次,然后这些变量即使在 函数 调用中也会保留其值。

C++ 函数中的 Static 变量示例

让我们看一个示例来演示 C++ 中函数内的 `static` 变量。

示例

编译并运行

输出

Count: 1
Count: 2
Count: 3

说明

在此示例中,变量 `count` 声明为 `static`。因此,该值会在函数调用之间传递。每次调用函数时,变量 `count` 都不会重新初始化。

2. 类中的 Static 数据成员

在 C++ 中,`static` 数据成员是使用 `static` 关键字定义的类成员。它在类的所有对象之间共享,并属于类,而不是单独的对象。对于多个对象,可能不存在同一 `static` 变量的多个副本。

C++ 类中的 Static 数据成员示例

让我们看一个示例来演示 C++ 中类内的 `static` 数据成员。

示例

编译并运行

输出

Total Students: 3

3. 类中的 Static 成员函数

在 C++ 中,`static` 成员函数独立于任何类的对象运行,并且它们只能访问 `static` 类元素。

C++ 类中的 Static 成员函数示例

让我们看一个示例来演示 C++ 中类内的 `static` 成员函数。

示例

编译并运行

输出

Count: 1  
Count: 2   

说明

该函数更新 `increment()` `static` 变量 `count`,该变量在多次函数调用中保留其值,并且可以在不创建对象的情况下调用。

4. 全局 Static 变量

`static` 全局变量保留一个内部连接,将其使用限制在声明它的特定文件。`static` 变量的内部链接可以防止它们与其他文件之间的冲突。

C++ 全局 Static 变量示例

让我们看一个示例来演示 C++ 中的全局 `static` 变量。

示例

编译并运行

输出

Global Counter: 1  
Global Counter: 2  

说明

全局计数器 `Globalcounter` 在函数调用中会保留其值,但由于 `static` 关键字,其使用仅限于此源文件。

5. 命名空间中的 Static 变量

命名空间中的 `static` 变量的工作方式类似于 `static` 全局变量,同时将其使用范围限制在当前文件。

C++ 命名空间中的 Static 变量示例

让我们看一个示例来演示 C++ 命名空间中的 `static` 变量。

示例

编译并运行

输出

Count Number: 1
Count Number: 2

6. 循环中的 Static 局部变量

在 C++ 中,循环内的 `static` 变量会在迭代之间保留其值。

示例

让我们看一个示例来演示 c++ 中循环内的 `static` 局部变量。

示例

编译并运行

输出

Loop Iteration: 1
Loop Iteration: 2
Loop Iteration: 3
Loop Iteration: 4
Loop Iteration: 5
Loop Iteration: 6

7. 多线程中的 Static

在 C++ 中,多线程程序中的 `static` 变量会触发数据竞争,因为线程共享它们的值。

示例

让我们看一个示例来演示 C++ 中多线程的 `static`。

示例

编译并运行

输出

Counter: Counter: 2
2

结论

总之,C++ 编程语言中的 `static` 关键字使用户能够执行有效的内存管理,同时保持封装规则以及共享数据协作。

`static` 允许程序员受益于基本功能,包括函数中的状态保留、类级别的数据共享以及变量作用域限制。线程化环境需要对数据进行特殊管理,以防止竞态条件。


C++ Static 选择题

1. 函数中 `static` 局部变量的关键特征是什么?

  1. 每次函数执行时,此变量的值都会重置。
  2. 局部变量在连续的函数执行中保持其初始值。
  3. 由于不允许修改,变量会保持其初始状态。
  4. 变量始终接收初始值为零。

答案: b) 局部变量在连续的函数执行中保持其初始值。

2. 关于类中的 `static` 数据成员,哪个说法是正确的?

  1. 类的对象会获得它们自己的 `static` 数据成员副本。
  2. `static` 数据成员需要类的对象才能访问它。
  3. 类的所有实例同时访问单个 `static` 数据成员。
  4. `static` 数据成员的初始值必须保留在类定义中。

答案: c) 类的所有实例同时访问单个 `static` 数据成员。

3. 如果一个 `static` 变量的类型是 `int` 且未显式初始化,它的默认值是什么?

  1. 未定义
  2. 垃圾值
  3. 编译器错误

答案: B) 零

4. `static` 成员函数通过共享数据访问所有类实例。

  1. 在 `static` 成员函数中,我们只能访问类中的 `static` 成员。
  2. `static` 成员函数需要通过类的实例进行调用。
  3. `static` 数据成员存在于类定义之外。
  4. `static` 函数提供了访问 `static` 和非 `static` 类成员的能力。

答案: a) 在 `static` 成员函数中,我们只能访问类中的 `static` 成员。

5. 在 C++ 编程中,将全局变量声明为 `static` 变量的目的是什么?

  1. 使其可以从其他文件访问
  2. 声明 `static` 会保留常量值。
  3. `static` 声明将变量的使用限制在首次定义它的文件中。
  4. 不同的函数可以通过 `static` 声明访问变量的多个实例。

答案: C) `static` 声明将变量的使用限制在首次定义它的文件中。


下一主题C++ 结构体