面试题答案
一键面试- 通过作用域解析运算符(::)访问全局变量
在多层嵌套函数且存在同名局部变量的情况下,若要访问全局变量,可在变量名前加上作用域解析运算符
::
。例如:
#include <iostream>
int globalVar = 10;
void outerFunction() {
int globalVar = 20; // 局部变量,隐藏了全局变量
std::cout << "局部变量 globalVar: " << globalVar << std::endl;
std::cout << "全局变量 globalVar: " << ::globalVar << std::endl;
}
int main() {
outerFunction();
return 0;
}
在上述代码中,::globalVar
用于明确访问全局变量globalVar
。
-
访问规则
- 当变量在局部作用域(函数内部等)被声明时,该局部变量会优先被访问,这是因为局部作用域的优先级高于全局作用域。
- 使用
::
作用域解析运算符可以绕过局部作用域,直接访问全局作用域中的变量。
-
隐藏(shadowing)问题
- 定义:隐藏(shadowing)是指在内部作用域(如函数内)声明了与外部作用域(如全局作用域)同名的变量,导致外部作用域的变量在内部作用域中被隐藏,无法直接访问。
- 影响:
- 可能导致代码可读性降低,因为开发者可能会混淆到底访问的是哪个变量。
- 如果不小心在局部作用域中修改了同名的局部变量,而本意是修改全局变量,会导致逻辑错误且这种错误较难排查。例如在上述代码中,如果没有使用
::
而直接对globalVar
进行修改,实际上修改的是局部变量globalVar
,而不是全局变量。