C++ 嵌套作用域访问
C++ Nested Scope Accessing
我最近在 cppreference:
中看到这段代码
string str="global scope";
void main()
{
string str="main scope";
if (true){
string str="if scope";
cout << str << endl;
}
cout << str << endl;
}
输出:
if scope
main scope
这很好,我理解整个嵌套范围的事情,我知道 if 范围内的 'str' 会在语句结束时堆栈展开时被销毁,所以它不会在那之后可用,因此第二个打印将主要 'str' 作为其参数。
但是,我知道 main 'str' 实际上在 IF 中可用,或者至少应该可用,但问题是 如何访问 main 'str' 来自 IF 语句?
我如何从主 and/or if 内部访问全局 'str'?
我知道只是使用不同的名称会更简单,但是这个问题不是针对特定的实际应用,而是为了更好地理解c++作用域。
这是一个 name-hiding 问题。并且
how can I access the main 'str' from inside the IF statement?
很遗憾,这是不可能的。无法访问这些隐藏的本地名称。
And how could I access a global 'str' from inside the main and/or the if?
您可以使用 scope resolution operator :: 作为它,例如::str
,在全局范围内引用名称str
。
if
块不能引用 main()
中定义的 str
变量,除非您更改其中一个变量的名称。无法访问与内部变量同名的外部变量。
但是,可以使用 ::
运算符访问全局变量。
不过,可以使用指针解决问题:
string str = "global-scope";
void main()
{
string str = "main scope";
string *ptrOfStr = &str;
if (true){
string str = "if scope";
cout << str << endl;
cout << "Value of str in main block : " << *ptrOfStr;
}
cout << str << endl;
}
我最近在 cppreference:
中看到这段代码string str="global scope";
void main()
{
string str="main scope";
if (true){
string str="if scope";
cout << str << endl;
}
cout << str << endl;
}
输出:
if scope
main scope
这很好,我理解整个嵌套范围的事情,我知道 if 范围内的 'str' 会在语句结束时堆栈展开时被销毁,所以它不会在那之后可用,因此第二个打印将主要 'str' 作为其参数。
但是,我知道 main 'str' 实际上在 IF 中可用,或者至少应该可用,但问题是 如何访问 main 'str' 来自 IF 语句?
我如何从主 and/or if 内部访问全局 'str'?
我知道只是使用不同的名称会更简单,但是这个问题不是针对特定的实际应用,而是为了更好地理解c++作用域。
这是一个 name-hiding 问题。并且
how can I access the main 'str' from inside the IF statement?
很遗憾,这是不可能的。无法访问这些隐藏的本地名称。
And how could I access a global 'str' from inside the main and/or the if?
您可以使用 scope resolution operator :: 作为它,例如::str
,在全局范围内引用名称str
。
if
块不能引用 main()
中定义的 str
变量,除非您更改其中一个变量的名称。无法访问与内部变量同名的外部变量。
但是,可以使用 ::
运算符访问全局变量。
不过,可以使用指针解决问题:
string str = "global-scope";
void main()
{
string str = "main scope";
string *ptrOfStr = &str;
if (true){
string str = "if scope";
cout << str << endl;
cout << "Value of str in main block : " << *ptrOfStr;
}
cout << str << endl;
}