Skip to content

C++中变量的作用域

一般来说,作用域定义为某物可以被操作的范围。在编程中,变量的作用域定义为程序代码中变量可以被访问、声明或操作的范围。主要有两种变量作用域:

  1. 局部变量
  2. 全局变量

Variable scope in C++

局部变量

在函数或代码块中定义的变量被称为局部变量。

{}之间的内容被认为是在一个代码块内。 局部变量仅在声明它们的代码块内存在,即它们不能在该块之外被访问或使用。 声明局部变量:局部变量在代码块内部声明。

  • C++
Text Only
// C++程序演示局部变量的使用
#include<iostream>
using namespace std;

void func()
{
    // 这个变量是局部于
    // func()函数的,不能在
    // 该函数外访问
    int age = 18;
}

int main()
{
    cout << "Age is: " << age;

    return 0;
}

Output:

Text Only
错误:age在此作用域中未声明

上述程序显示错误信息“age在此作用域中未声明”。变量agefunc()函数内声明,因此它是该函数的局部变量,不能在函数外部访问。

修正后的程序: 要修正上述错误,我们需要从func()函数内部显示变量age的值。如下所示:

  • C++
Text Only
// C++程序演示局部变量的使用
#include<iostream>
using namespace std;

void func()
{
    // 这个变量是局部于
    // func()函数的,不能在
    // 该函数外访问
    int age = 18;
    cout << age;
}

int main()
{
    cout << "Age is: ";
    func();

    return 0;
}

Output:

Text Only
Age is: 18

全局变量

顾名思义,全局变量可以从程序的任何部分访问。

它们在程序的整个生命周期内有效。 它们在程序顶部的所有函数或块之外声明。 声明全局变量:全局变量通常在所有函数和块外,在程序的顶部声明。它们可以从程序的任何部分访问。

  • C++
Text Only
// C++程序演示全局变量的使用
#include<iostream>
using namespace std;

// 全局变量
int global = 5;

// 从函数内访问全局变量
void display()
{
    cout << global << endl;
}

// 主函数
int main()
{
    display();

    // 从主函数中修改全局变量的值
    global = 10;
    display();
}

输出

Text Only
5
10

在程序中,变量global在程序顶部的所有函数外声明,因此它是全局变量,可以从程序的任何地方访问或更新。

当函数内存在与全局变量同名的局部变量时

如果函数内存在与全局变量同名的局部变量,并且函数试图访问该名称的变量,那么哪个变量会被优先考虑?局部变量还是全局变量?查看以下程序以理解这个问题:

  • C++
Text Only
// C++程序演示局部变量和全局变量的作用域
#include<iostream>
using namespace std;

// 全局变量
int global = 5;

// 主函数
int main()
{
    // 与全局变量同名的局部变量
    int global = 2;
    cout << global << endl;
}

在上面的程序中,程序顶部声明的global是全局变量,值为5,而在main函数内声明的global是局部变量,值为2。因此,当从main函数打印名为global的变量时,输出将是什么?2还是5?

通常,当定义两个同名变量时,编译器会产生编译时错误。但如果这些变量定义在不同的作用域中,编译器允许它们存在。 每当定义了与全局变量同名的局部变量时,编译器将优先考虑局部变量。

如何在存在同名局部变量时访问全局变量?

如果我们想做上述任务的相反操作,即在存在同名局部变量的情况下访问全局变量,该如何解决?为解决此问题,我们需要使用作用域解析运算符。下面的程序演示了如何使用作用域解析运算符来实现:

  • C++
Text Only
// C++程序演示如何使用作用域解析运算符访问全局变量
#include<iostream>
using namespace std;

// 全局变量
int x = 0;

int main()
{
    // 局部变量
    int x = 10;
    cout << "全局x的值是 " << ::x;
    cout << "\n局部x的值是 " << x;
    return 0;
}输出: 
Text Only
全局x的值是 0
局部x的值是 10

Comments