MST

星途 面试题库

面试题:C++变量作用域与存储类型

在C++中,局部变量、全局变量、静态局部变量和静态全局变量的作用域和存储类型分别是什么?请举例说明它们的特点及使用场景。
46.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 局部变量

  • 作用域:在定义它的函数体或代码块内有效。
  • 存储类型:通常为自动存储类型(auto,一般省略不写),存储在栈区。当函数被调用时,局部变量在栈上分配空间,函数结束时,空间被释放。
  • 特点:生命周期与所在函数或代码块的执行周期相同。不同函数内可以定义同名局部变量,它们相互独立,互不影响。
  • 使用场景:用于函数内部临时存储数据,比如函数内部的循环控制变量、临时计算结果等。例如:
void function() {
    int localVar = 10; // 局部变量
    for (int i = 0; i < localVar; ++i) {
        int temp = i * 2; // 另一个局部变量
        std::cout << temp << std::endl;
    }
    // 这里 localVar 和 temp 的作用域结束,变量失效
}

2. 全局变量

  • 作用域:从定义处开始,到整个源文件结束都有效。如果要在其他源文件中使用,需用extern声明。
  • 存储类型:静态存储类型,存储在静态数据区(全局区)。程序开始时分配空间,程序结束时释放空间。
  • 特点:生命周期贯穿整个程序运行过程。在整个程序中只有一份实例,所有函数都可以访问和修改它。但过多使用全局变量可能导致代码耦合度增加,降低程序的模块化和可维护性。
  • 使用场景:当某些数据需要在多个函数间共享且不希望频繁传递参数时,可考虑使用全局变量。例如:
int globalVar = 20; // 全局变量

void func1() {
    globalVar++;
}

void func2() {
    std::cout << "Global variable value: " << globalVar << std::endl;
}

3. 静态局部变量

  • 作用域:与局部变量相同,在定义它的函数体或代码块内有效。
  • 存储类型:静态存储类型,存储在静态数据区(全局区)。在程序第一次执行到定义处时初始化,之后每次调用函数不再重新初始化,直到程序结束时释放空间。
  • 特点:虽然作用域有限,但生命周期与程序相同。它的值在函数调用结束后不会消失,下次调用函数时仍保留上次修改后的值。
  • 使用场景:用于统计函数被调用的次数,或保存函数内部的一些中间状态。例如:
void staticLocalFunction() {
    static int staticLocalVar = 0;
    staticLocalVar++;
    std::cout << "Static local variable value: " << staticLocalVar << std::endl;
}

4. 静态全局变量

  • 作用域:仅在定义它的源文件内有效,其他源文件无法访问,无需担心命名冲突。
  • 存储类型:静态存储类型,存储在静态数据区(全局区)。程序开始时分配空间,程序结束时释放空间。
  • 特点:与全局变量类似,但作用域更局限,增强了数据的封装性和模块性。
  • 使用场景:当源文件内部需要一些全局共享但又不希望被其他源文件访问的数据时使用。例如:
// file1.cpp
static int staticGlobalVar = 30;

void file1Function() {
    staticGlobalVar++;
}

// file2.cpp
// 这里无法访问 staticGlobalVar