C++中变量的作用域¶
一般来说,作用域定义为某物可以被操作的范围。在编程中,变量的作用域定义为程序代码中变量可以被访问、声明或操作的范围。主要有两种变量作用域:
- 局部变量
- 全局变量
局部变量¶
在函数或代码块中定义的变量被称为局部变量。
在{
和}
之间的内容被认为是在一个代码块内。 局部变量仅在声明它们的代码块内存在,即它们不能在该块之外被访问或使用。 声明局部变量:局部变量在代码块内部声明。
- C++
// C++程序演示局部变量的使用
#include<iostream>
using namespace std;
void func()
{
// 这个变量是局部于
// func()函数的,不能在
// 该函数外访问
int age = 18;
}
int main()
{
cout << "Age is: " << age;
return 0;
}
Output:
上述程序显示错误信息“age在此作用域中未声明”。变量age
在func()
函数内声明,因此它是该函数的局部变量,不能在函数外部访问。
修正后的程序: 要修正上述错误,我们需要从func()
函数内部显示变量age
的值。如下所示:
- C++
// C++程序演示局部变量的使用
#include<iostream>
using namespace std;
void func()
{
// 这个变量是局部于
// func()函数的,不能在
// 该函数外访问
int age = 18;
cout << age;
}
int main()
{
cout << "Age is: ";
func();
return 0;
}
Output:
全局变量¶
顾名思义,全局变量可以从程序的任何部分访问。
它们在程序的整个生命周期内有效。 它们在程序顶部的所有函数或块之外声明。 声明全局变量:全局变量通常在所有函数和块外,在程序的顶部声明。它们可以从程序的任何部分访问。
- C++
// C++程序演示全局变量的使用
#include<iostream>
using namespace std;
// 全局变量
int global = 5;
// 从函数内访问全局变量
void display()
{
cout << global << endl;
}
// 主函数
int main()
{
display();
// 从主函数中修改全局变量的值
global = 10;
display();
}
输出
在程序中,变量global
在程序顶部的所有函数外声明,因此它是全局变量,可以从程序的任何地方访问或更新。
当函数内存在与全局变量同名的局部变量时¶
如果函数内存在与全局变量同名的局部变量,并且函数试图访问该名称的变量,那么哪个变量会被优先考虑?局部变量还是全局变量?查看以下程序以理解这个问题:
- C++
// 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++
// C++程序演示如何使用作用域解析运算符访问全局变量
#include<iostream>
using namespace std;
// 全局变量
int x = 0;
int main()
{
// 局部变量
int x = 10;
cout << "全局x的值是 " << ::x;
cout << "\n局部x的值是 " << x;
return 0;
}输出: