目录

  1. 变量作用域概述
  2. 局部变量(Local Variables)
  3. 全局变量(Global Variables)
  4. 静态变量(Static Variables)
  5. 外部变量(Extern Variables)
  6. namespace 作用域
  7. constexprconst 作用域
  8. 参考资料

1. 变量作用域概述

作用域(Scope) 指的是变量在程序中可访问的范围。C++ 主要有以下几种作用域:

  1. 局部作用域(函数/代码块内部的变量)
  2. 全局作用域(整个程序都可访问的变量)
  3. 静态作用域(局部或全局变量,但生命周期更长)
  4. 外部作用域(通过 extern 关键字在多个文件共享)
  5. 命名空间作用域(通过 namespace 限制变量访问范围)

2. 局部变量(Local Variables)

局部变量是在函数或代码块内部定义的变量,它们只能在其定义的范围内访问,函数执行结束后,局部变量会被销毁

示例

#include <iostream>

void testScope() {
    int localVar = 10;  // 局部变量
    std::cout << "localVar = " << localVar << std::endl;
}

int main() {
    testScope();
    // std::cout << localVar; // ❌ 错误,localVar 只能在 testScope() 内访问
    return 0;
}

特点:

  • 只能在声明的代码块内访问
  • 作用域结束时自动释放

3. 全局变量(Global Variables)

全局变量是在所有函数之外定义的变量,整个程序都可以访问

示例

#include <iostream>

int globalVar = 100;  // 全局变量

void showGlobalVar() {
    std::cout << "globalVar = " << globalVar << std::endl;
}

int main() {
    showGlobalVar();
    globalVar = 200;  // 在 main() 中修改全局变量
    std::cout << "globalVar = " << globalVar << std::endl;
    return 0;
}

特点:

  • 作用域:整个程序
  • 生命周期:程序运行期间一直存在
  • ⚠️ 注意:过多使用全局变量可能导致代码难以维护

4. 静态变量(Static Variables)

静态变量使用 static 关键字声明,分为局部静态变量全局静态变量

4.1 局部静态变量

  • 只初始化一次,并在程序运行期间一直存在,但作用域仍是局部的
  • 适用于需要保持状态的函数(如计数器)。

示例

#include <iostream>

void counter() {
    static int count = 0;  // 仅初始化一次
    count++;
    std::cout << "count = " << count << std::endl;
}

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

输出

count = 1
count = 2
count = 3

特点:

  • 只在首次调用时初始化
  • 作用域仍然是局部的
  • 函数调用结束后不会销毁

4.2 全局静态变量

  • static 关键字限制全局变量的作用域,使其只能在当前文件可见

示例

// file1.cpp
static int fileStaticVar = 10;  // 仅 file1.cpp 可访问

// file2.cpp
// extern int fileStaticVar; // ❌ 错误,static 变量不能被外部访问


5. 外部变量(Extern Variables)

使用 extern 关键字在多个文件之间共享全局变量

示例

// file1.cpp
#include <iostream>
int sharedVar = 50;  // 定义外部变量
void printVar() {
    std::cout << "sharedVar = " << sharedVar << std::endl;
}

// file2.cpp
extern int sharedVar;  // 声明外部变量
void printVar();

int main() {
    printVar();  // 访问 file1.cpp 的变量
    return 0;
}

特点

  • extern 仅声明变量,不分配存储空间
  • 适用于多个文件共享全局变量

6. namespace 作用域

C++ 提供 namespace(命名空间) 以避免全局变量命名冲突。

示例

#include <iostream>

namespace SpaceA {
    int value = 10;
}

namespace SpaceB {
    int value = 20;
}

int main() {
    std::cout << "SpaceA::value = " << SpaceA::value << std::endl;
    std::cout << "SpaceB::value = " << SpaceB::value << std::endl;
    return 0;
}

输出

SpaceA::value = 10
SpaceB::value = 20

特点

  • 避免全局变量命名冲突
  • using namespace xxx; 语法可简化代码

7. constexprconst 作用域

constconstexpr 变量在作用域内不会改变

7.1 const 变量

const int MAX_SIZE = 100;

  • 作用域与普通变量相同(局部或全局)

7.2 constexpr 变量(C++11 引入)

constexpr int MAX_SIZE = 100;

  • 必须在编译时求值
  • 作用域同 const

8. 参考资料


总结

作用域变量类型说明
局部变量函数/代码块内部仅在定义的范围内可见,函数结束时销毁
全局变量函数外部整个程序可见,生命周期贯穿整个程序
静态变量static 变量仅初始化一次,局部静态变量不销毁,全局静态变量仅限本文件
外部变量extern 变量允许多个文件共享同一变量
命名空间变量namespace用于避免命名冲突
常量作用域const / constexpr只读变量,constexpr 需要在编译时求值

掌握变量作用域有助于编写高效、可维护的 C++ 代码!🚀