跳转至

C++ 变量作用域

在 C++ 中,变量并不是在程序的任意位置都可访问的。 变量的作用域(Scope) 指的是程序中 可以访问该变量的区域

一般来说,变量可以在以下三个位置定义:

  1. 函数或代码块内部 定义的变量,称为 局部变量
  2. 函数参数列表中 定义的变量,称为 形式参数
  3. 所有函数外部 定义的变量,称为 全局变量

一、作用域的分类

根据变量声明的位置不同,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;
}

输出结果:

10

四、变量的初始化规则

局部变量

  • 不会被自动初始化
  • 若未初始化,其值是 未定义的

全局变量(以及静态变量)

  • 系统会自动初始化为默认值:
类型 默认初始值
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;
}

输出结果:

块变量: 20
外部变量: 10

说明:

  • 内部块中的 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;
}

输出结果:

类变量: 30

说明:

  • class_var静态成员变量
  • 使用 作用域解析运算符 :: 通过类名访问

七、本章小结

  • 作用域决定了变量的 可见性和生命周期
  • 局部变量 > 块变量 > 全局变量:作用范围逐级扩大
  • 内层作用域变量会隐藏外层同名变量
  • 合理控制变量作用域有助于:
  • 减少错误
  • 提高代码可维护性
  • 避免命名冲突