C++ 变量作用域¶
在 C++ 中,变量并不是在程序的任意位置都可访问的。 变量的作用域(Scope) 指的是程序中 可以访问该变量的区域 。
一般来说,变量可以在以下三个位置定义:
- 函数或代码块内部 定义的变量,称为 局部变量
- 函数参数列表中 定义的变量,称为 形式参数
- 所有函数外部 定义的变量,称为 全局变量
一、作用域的分类¶
根据变量声明的位置不同,C++ 中常见的作用域包括:
局部作用域(Local Scope)¶
- 在 **函数内部 ** 声明的变量
- 只能在该函数内部访问
- 函数被调用时创建,函数结束时销毁
全局作用域(Global Scope)¶
- 在 所有函数和代码块之外 声明的变量
- 可被程序中任意函数访问
- 程序启动时创建,程序结束时销毁
块作用域(Block Scope)¶
- 在
{}代码块内部声明的变量 - 只能在该代码块内部访问
- 每次进入代码块时创建,离开时销毁
类作用域(Class Scope)¶
- 在类内部声明的成员变量
- 可被该类的成员函数访问
- 生命周期取决于对象或类本身(静态成员)
⚠️ 注意: 如果在 内部作用域 中声明了一个与外部作用域 同名 的变量,内部变量会 隐藏(覆盖) 外部变量。
二、局部变量¶
在函数或代码块内部声明的变量称为 局部变量 ,只能在其声明的作用域内使用。
示例:
#include <iostream>
using namespace std;
int main()
{
// 局部变量声明
int a, b;
int c;
// 初始化
a = 10;
b = 20;
c = a + b;
cout << c;
return 0;
}
三、全局变量¶
在所有函数外部定义的变量称为 全局变量 。 全局变量在程序的整个生命周期内都有效。
示例:
#include <iostream>
using namespace std;
// 全局变量声明
int g;
int main()
{
int a, b;
a = 10;
b = 20;
g = a + b;
cout << g;
return 0;
}
局部变量与全局变量同名¶
当局部变量与全局变量同名时,局部变量会隐藏全局变量。
#include <iostream>
using namespace std;
// 全局变量
int g = 20;
int main()
{
// 局部变量
int g = 10;
cout << g; // 输出局部变量的值
return 0;
}
输出结果:
四、变量的初始化规则¶
局部变量¶
- 不会被自动初始化
- 若未初始化,其值是 未定义的
全局变量(以及静态变量)¶
- 系统会自动初始化为默认值:
| 类型 | 默认初始值 |
|---|---|
int |
0 |
char |
'\0' |
float |
0 |
double |
0 |
| 指针 | NULL / nullptr |
✅ 良好的编程习惯:始终在定义变量时进行初始化
五、块作用域¶
块作用域指的是在 {} 代码块内部声明的变量。
示例:
#include <iostream>
int main()
{
int a = 10;
{
int a = 20; // 块作用域变量
std::cout << "块变量: " << a << std::endl;
}
std::cout << "外部变量: " << a << std::endl;
return 0;
}
输出结果:
说明:
- 内部块中的
a覆盖了外部的a - 离开代码块后,内部变量被销毁
六、类作用域¶
类作用域是指 在类内部声明的成员变量 。
示例:
#include <iostream>
class MyClass {
public:
static int class_var; // 类作用域变量
};
int MyClass::class_var = 30;
int main()
{
std::cout << "类变量: " << MyClass::class_var << std::endl;
return 0;
}
输出结果:
说明:
class_var是 静态成员变量- 使用 作用域解析运算符
::通过类名访问
七、本章小结¶
- 作用域决定了变量的 可见性和生命周期
- 局部变量 > 块变量 > 全局变量:作用范围逐级扩大
- 内层作用域变量会隐藏外层同名变量
- 合理控制变量作用域有助于:
- 减少错误
- 提高代码可维护性
- 避免命名冲突