【问题标题】:how to access a specific scope in c++?如何访问 C++ 中的特定范围?
【发布时间】:2014-10-11 00:34:21
【问题描述】:
#include <iostream>
using namespace std;
int x=24 ;
int main()
{
     int x=0;
     {
         int x=5 ;
        ::x= x+2 ;
     }
    cout<<::x<<endl  ;//first 
    cout<<x<<endl ; // second 
    return 0;
} 

在这个简单的示例中,我使用的是代码块,并且我知道我可以使用范围解析运算符修改全局变量。 我在这个例子中修改了全局变量,但我想知道是否有办法修改特定范围内的变量,如主函数(不需要(范围解析运算符)方式) 这意味着在这个例子中我需要第一个输出是 24 和下一个 7 。 对不起我的英语我希望能理解这个问题

【问题讨论】:

  • 问题是在赋值中(第 9 行)你用 7 覆盖了 24,所以全局 x==7、主 x==0 和内部 x 丢失了。
  • 请不要从字面上看这个例子你知道在这个范围内修改 main 中的 x 的方法

标签: c++ scope


【解决方案1】:

在 C++ 中无法从特定范围访问变量。

如果您在内部范围内声明一个与外部范围内的对象或变量同名的对象或变量,那么出于所有意图和目的,外部范围内的对象或变量在内部范围内是不直接可见的.

如果您已经拥有指向外部作用域对象的指针或引用,当然,您仍然可以间接访问它。您只是无法直接访问它。

这是 C 和 C++ 的基本概念;但许多其他编程语言具有相同的类似概念。

【讨论】:

    【解决方案2】:

    C++ 的范围规则是文本的,AFAIK 你不能这样做,因为你不能把命名空间放在函数内部。但是,如果您发现自己处于这样的绑定中,引入具有唯一名称的引用可能会有所帮助:

    #include <iostream>
    using namespace std;
    int x = 24;
    int main()
    {
         int x = 0;
         int & main_outer_x = x;
         {
             int x = 5;
             main_outer_x = x + 2;
         }
        cout << ::x << endl; //first 
        cout << x << endl; // second 
        return 0;
    }
    

    这给了你:

    24
    7
    

    这不应该在您生成的代码中占用更多内存,并且可以让您保持外部名称不变。不过,如果您故意在函数中发生名称冲突,则可能会令人困惑且容易出错。这是抽象代码,因此很难批评,但大多数具有这种模式的具体代码可能应该以另一种方式完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多