C++ 中的存储类(auto、register、extern、mutable)

2025 年 4 月 25 日 | 阅读 9 分钟

在 C++ 中,存储类是定义程序中变量(如 auto、registerstatic 等)的生命周期、作用域和存储位置的关键字。存储类指定了在 C++ 程序中如何为变量分配和释放内存。

语法

它具有以下语法:

在此语法中,storage_class 表示存储类,var_data_type 表示变量数据类型,var_name 表示变量名。

简单的 C++ 存储类示例

让我们看一个简单的示例来演示 C++ 中的存储类。

示例

编译并运行

输出

Enter the value of X: 5
Enter the value of Y: 10
Addition result (auto + register): 15

C++ 中存储类的类型

C++ 中主要有六种存储类。

Storage Classes in C++

下表显示了生命周期、可见性和初始值。

存储类关键字生命周期可见性初始值
自动auto函数块局部垃圾值
寄存器register函数块局部垃圾值
静态static整个程序局部
外部extern整个程序全球
可变可变的Class局部垃圾值
线程局部thread_localThread局部 

1. C++ 中的自动 (auto) 存储类

auto 存储类是局部变量的默认存储类。它主要用于为变量声明 auto 类。它使我们能够声明特定数据类型的变量,包括 int、double 和 char。它提供更快的内存访问、逻辑数据组织,并增强程序清晰度和效率。

C++ 自动存储类示例

让我们看一个示例来演示 C++ 中的自动存储类。

示例

编译并运行

输出

15 
7.45 
Hello TpointTech 
T

说明

在此示例中,auto 存储类用于变量。auto 关键字不能用于显式声明 auto 变量。

2. C++ 中的寄存器 (register) 存储类

在 C++ 中,"register" 存储类主要用于指示编译器将变量存储在寄存器中。我们可以比局部或自动变量更快地访问寄存器变量,尽管它们具有相同的功能。寄存器存储类的默认值为 0。

(&) 运算符不能与寄存器变量一起使用。"register" 存储类的变量也具有自动存储持续时间。

C++ 寄存器存储类示例

让我们看一个示例来演示 C++ 中的寄存器存储类。

示例

编译并运行

输出

i = 0, count = 2
i = 1, count = 3
i = 2, count = 5
i = 3, count = 8
i = 4, count = 12
i = 5, count = 17
i = 6, count = 23

3. C++ 中的静态 (static) 存储类

在 C++ 中,静态存储类用于声明在整个程序持续时间内保持其值的变量。静态变量使用 static 关键字声明。我们可以多次声明静态变量,但变量值只能赋值一次。

局部变量在程序启动时创建,在程序终止时销毁。"static" 变量在块或函数内具有局部作用域,但它们的值在函数调用之间保持不变。它们通常存储在内存的单独数据段中。

C++ 静态存储类示例

让我们看一个示例来演示 C++ 中的静态存储类。

示例

编译并运行

输出

x = 3, Counter = 7
x = 4, Counter = 6
x = 5, Counter = 5
x = 6, Counter = 4
x = 7, Counter = 3
x = 8, Counter = 2
x = 9, Counter = 1
x = 10, Counter = 0

4. C++ 中的外部 (extern) 存储类

在 C++ 中,extern 存储类用于提供全局变量的引用。它在函数外部声明。无论何时在 C++ 中声明外部变量,该变量都可以在整个程序中的任何代码行中使用。当多个 C++ 文件共享相同的全局变量和函数时,此 extern 修饰符非常有用。

C++ 外部存储类示例

让我们看一个示例来演示 C++ 中带有全局变量的 'extern' 存储类。

示例

编译并运行

输出

Enter the Value of x: 7
Value of the variable 'x', declared as extern: 7
Modified value of the variable 'x', declared as extern: 7

5. C++ 中的可变 (mutable) 存储类

在 C++ 中,mutable 存储类用于通过常量 (const) 函数更改类的一个或多个数据成员。它可以通过mutable 关键字轻松声明,该关键字主要用于使对象的特定数据成员成为修饰符。'mutable' 关键字允许修改 const 对象的某个数据成员,即使在 const 成员函数内部也是如此。

C++ 可变存储类示例

让我们看一个示例来演示 C++ 中的可变存储类。

示例

编译并运行

输出

Before modifying the value of y: 15
After modifying the value of y: 50

6. C++ 中的线程局部 (thread_local) 存储类

在 C++ 中,thread_local 存储类是 C++11 中引入的新存储类。它可用于将对象定义为 thread_local。thread_local 对象属性在其变量与多个存储说明符(如 extern 和 static)组合时进行修改。

C++ 线程局部存储类示例

让我们看一个示例来演示 C++ 中的 thread_local 存储类。

示例

编译并运行

输出

After modifying the value of x inside the Main() function: 25 0x771e4eece73c
Before modifying the value of x inside the Thread_localTest() function: 40 0x771e4ee006bc
The value of x inside the Main() function: 25 0x771e4eece73c

C++ 中为什么要使用存储类?

在 C++ 中,存储类用于控制变量在内存中的保存方式、它们的生命周期以及它们在程序中的访问位置。C++ 对于管理内存资源、提高效率和确保变量作用域和生命周期至关重要。以下是使用 C++ 中存储类的一些主要原因:

  • 内存管理:不同的存储类允许程序员以各种方式为变量分配内存。例如,"auto" 变量通常在栈上分配,具有自动内存管理,而 "static" 变量则在单独的数据段中分配,具有静态内存管理。
  • 生命周期控制:存储类决定变量的生命周期。"Auto" 变量的作用域有限,当它们超出作用域时会自动销毁。"Static" 变量在函数调用之间持续存在,在程序执行期间保留其值。
  • 性能优化:"register" 存储类允许程序员向编译器建议将变量存储在 CPU 寄存器中,这可以实现更快的访问。"register" 关键字有助于提高代码关键部分的性能。
  • 变量共享:一些存储类允许全局变量在不同的翻译单元之间共享。这对于创建可以在程序多个部分访问的全局变量非常有用,从而促进代码库不同部分之间的通信。
  • 代码组织:正确使用存储类有助于构建良好、组织有序的代码。通过为每个变量选择适当的存储类,程序员可以指示变量的预期作用域、可见性和生命周期,从而使代码更易于理解和维护。

C++ 存储类多选题

1. 在 C++ 中,定义为 static 的变量的默认初始值是什么?

  1. 1
  2. 0
  3. 依赖于编译器
  4. 随机垃圾值
 

答案: b) 0


2. 当在 C++ 程序中声明寄存器变量时,它被分配在哪里?

  1. 在堆内存中
  2. 在栈内存中
  3. 在 CPU 寄存器中,以便更快访问
  4. 在数据段中
 

答案: c) 在 CPU 寄存器中,以便更快访问


3. 在哪个存储类中,const 关键字用于在 C++ 中声明变量?

  1. Auto 存储类
  2. Register 存储类
  3. Extern 存储类
  4. Static 存储类
 

答案: a) Auto 存储类


4. 下面程序的输出是什么?

  1. TpointTech Class: 1
  2. TpointTech Class: 1
    TpointTech Class: 2
  3. TpointTech Class: 1
    TpointTech Class: 2
    TpointTech Class: 3
  4. 以上都不是
 

答案: b) TpointTech Class: 1

TpointTech Class: 2


5. 以下哪个存储类是 C++ 中全局变量的默认存储类?

  1. 静态
  2. 寄存器
  3. Auto
  4. Extern
 

答案: d) Extern


下一主题C++ 数组