【问题标题】:C++ Nested Scope AccessingC++ 嵌套范围访问
【发布时间】:2017-01-25 02:56:57
【问题描述】:

我最近在 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”作为参数。

但是,我知道主“str”实际上在 IF 中可用,或者至少应该是,但问题是 我如何从 IF 语句中访问主“str”?

我如何从 main 和/或 if 内部访问全局“str”?

我知道只使用不同的名称会更简单,但这个问题不是针对特定的实际应用,而是为了更好地理解 c++ 作用域。

【问题讨论】:

  • cppreference 永远不会有“void main”。这甚至不会编译。
  • 这取决于你的编译器
  • 它不会在使用 gcc 和 clang 的 cppreference.com 上编译。

标签: c++ scope nested name-hiding


【解决方案1】:

这是一个隐藏名称的问题。和

如何从 IF 语句中访问主“str”?

很遗憾,这是不可能的。无法访问这些被隐藏的本地名称。

我如何从 main 和/或 if 内部访问全局“str”?

您可以使用scope resolution operator :: 来表示它,例如::str,指的是全局范围内的名称str

【讨论】:

  • 谢谢,你 100% 确定这是不可能的(第一个问题)>
  • @J3STER 是的,我是。无法访问这些被隐藏的本地名称。
  • 我会第二点,局部变量在其范围之外是不可访问的。局部变量在范围退出时也被销毁,所以我看不出如何访问该对象?
  • @PaulHK 问题是当内部作用域用自己的内部str 变量隐藏该变量时,内部作用域如何访问外部作用域的str 变量。答案是不可能的。您的评论读起来就像您认为外部范围正在尝试访问内部范围的变量。这也是不可能的。
【解决方案2】:

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;
}

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 2013-01-03
    • 1970-01-01
    • 2010-11-08
    • 2018-08-30
    • 2012-04-28
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多