存储类是定义变量或函数的作用域、生命周期和可见性的方法。C++ 提供了几种不同的存储类,每一种都有其特定的用途和特性。
自动存储类 (auto)
auto 是 C++ 中默认的存储类。当未指定存储类时,变量被视为自动存储类。auto 变量在其声明所在的块作用域内有效,并且在该块结束时被销毁。
// www.javascriptcn.com code example
#include <iostream>
int main() {
auto int x = 10; // x 是一个自动变量
{
auto int y = 20; // y 是一个自动变量
std::cout << "x: " << x << ", y: " << y << std::endl;
} // y 在这里被销毁
std::cout << "x: " << x << std::endl; // 输出 x 的值
return 0;
}静态存储类 (static)
static 存储类用于定义静态变量。静态变量在其声明所在的块作用域内有效,但它们不会在块结束时被销毁。静态变量在程序的整个生命周期内都存在,并且它们的值在函数调用之间保持不变。
// www.javascriptcn.com code example
#include <iostream>
void func() {
static int count = 0; // count 是一个静态变量
count++;
std::cout << "count: " << count << std::endl;
}
int main() {
func(); // 输出 count: 1
func(); // 输出 count: 2
func(); // 输出 count: 3
return 0;
}寄存器存储类 (register)
register 存储类用于建议编译器将变量存储在寄存器中,而不是内存中。这可以加快访问速度,因为寄存器比内存访问速度快得多。然而,现代编译器通常会忽略这个建议,因为它们可以根据需要优化代码。
#include <iostream>
int main() {
register int x = 10; // 建议将 x 存储在寄存器中
std::cout << "x: " << x << std::endl;
return 0;
}外部存储类 (extern)
extern 存储类用于声明一个已在其他地方定义的变量。它告诉编译器这个变量在其他地方已经被定义,因此不需要为它分配额外的空间。
// www.javascriptcn.com code example
// file1.cpp
int globalVar = 20;
// file2.cpp
extern int globalVar; // 声明 globalVar 已在其他地方定义
#include <iostream>
int main() {
std::cout << "globalVar: " << globalVar << std::endl;
return 0;
}全局存储类 (全局变量)
全局变量是在任何函数之外声明的变量。它们在整个程序中都可以访问,并且具有文件作用域。这意味着全局变量可以在声明它们的源文件中的任何位置访问。
// www.javascriptcn.com code example
#include <iostream>
int globalVar = 30; // 全局变量
void printGlobalVar() {
std::cout << "globalVar: " << globalVar << std::endl;
}
int main() {
printGlobalVar();
return 0;
}局部存储类 (局部变量)
局部变量是在函数内部声明的变量。它们只在声明它们的块作用域内有效。一旦块结束,局部变量就会被销毁。
// www.javascriptcn.com code example
#include <iostream>
void func() {
int localVar = 40; // 局部变量
std::cout << "localVar: " << localVar << std::endl;
}
int main() {
func(); // 输出 localVar: 40
// std::cout << "localVar: " << localVar << std::endl; // 错误:localVar 不存在于此作用域
return 0;
}通过理解和使用这些存储类,你可以更好地控制变量和函数的作用域、生命周期以及可见性,从而编写出更高效、更清晰的 C++ 程序。