C++ 存储类


C++ 存储类是用来指定变量和函数的作用域(可见性)和生命周期的特殊关键字。在 C++ 中,有四个关键字用于控制存储类别,分别是 auto、register、static 和 extern。

  1. auto 存储类

auto 存储类定义了一个变量的自动存储。这意味着该变量只有在定义它的函数执行期间才存在。一旦函数执行完毕,该变量就会被销毁。

示例代码:

void someFunction() {
  auto int a = 5;
  cout << a << endl;
}

int main() {
  someFunction();
  return 0;
}

在上面的代码中,变量 a 的作用域被限制在函数 someFunction() 中,只有在函数执行期间才存在。

  1. register 存储类

register 存储类定义了一个变量的寄存器存储。这意味着该变量被存储在处理器的寄存器中,而不是内存中。这样可以提高变量的访问速度,但是寄存器的数量是有限的。

示例代码:

void someFunction() {
  register int a = 5;
  cout << a << endl;
}

int main() {
  someFunction();
  return 0;
}

在上面的代码中,变量 a 被定义为寄存器存储类型,这样就可以从处理器的寄存器中访问它,提高代码效率。

  1. static 存储类

static 存储类定义了一个变量的静态存储。这意味着该变量在程序声明周期内存在,而不是在定义它的块作用域内。如果一个变量被声明为静态存储类型,则它只会被初始化一次,即使执行了多次定义语句。

示例代码:

void someFunction() {
  static int a = 0;
  cout << a << endl;
  a++;
}

int main() {
  someFunction(); // output: 0
  someFunction(); // output: 1
  someFunction(); // output: 2
  return 0;
}

在上面的代码中,变量 a 被定义为静态存储类型,每次调用函数时都会累加,但是其值在整个程序生命周期中只会被初始化一次。

  1. extern 存储类

extern 存储类用于提供一个全局变量的引用,对于多个文件共享变量时非常有用。外部变量可以在一个文件中定义和初始化,在另一个文件中声明,然后可以在两个文件中都使用。

示例代码:

文件1:

// file1.cpp
#include <iostream>
using namespace std;

int count; // 全局变量

extern void write_extern();

int main() {
  count = 5;
  write_extern();
  return 0;
}

文件2:

// file2.cpp
#include <iostream>
using namespace std;

extern int count;

void write_extern(void) {
   cout << "Count is " << count << endl;
}

在上面的代码中,文件2中的全局变量 count 在文件1中进行了初始化,但在文件2中仅进行了声明和引用。在文件1中调用了文件2中声明的函数,输出了变量 count 的值。

总结:

C++ 存储类可以帮助我们在不同的场景下控制变量的作用域和生命周期,同时可以提高程序的效率和优化内存管理。当我们需要存储全局变量或共享变量时,staticextern 存储类非常有用;当我们需要提高变量的访问速度时,register 存储类可以帮助我们实现这一目标;当我们需要在函数中控制变量的作用域和生命周期时,auto 存储类是个好选择。