【问题标题】:Accessing variables with the same name at different scopes [duplicate]在不同范围内访问具有相同名称的变量[重复]
【发布时间】:2011-03-03 23:22:50
【问题描述】:

#include <iostream>
using namespace std;

        int a = 1;

int main()
{
        int a = 2;

        if(true)
        {
                int a = 3;
                cout << a 
                     << " " << ::a // Can I access a = 2 here?
                     << " " << ::a << endl;
        }
        cout << a << " " << ::a << endl;
}

有输出

3 1 1
2 1

有没有办法在 if 语句中访问 'a' 等于 2,其中 'a' 等于 3,输出

3 2 1
2 1

注意:我知道这不应该完成(并且代码不应该达到我需要询问的程度)。这个问题更多的是“可以做到吗”。

【问题讨论】:

  • 我不知道这是否有语法(我怀疑),但请注意,在实践中,由于两个变量在同一个函数中,你会总是控制它们,所以你可以简单地重命名它们中的一个......
  • 简单。重命名变量 a1 a2 a3 重建它现在可以工作了。说真的,即使它被允许,它也会出现在每个编码标准的不良实践部分。为每个变量使用唯一的名称。

标签: c++ scope


【解决方案1】:

不,你不能,a (2) 被隐藏了。

参考:3.3.7/1

名称可以通过显式隐藏 在 a 中声明同名 嵌套声明区域或派生 类 (10.2)。

参考:3.4.3/1

类或命名空间的名称 成员可以在 :: 之后引用 范围解析运算符 (5.1) 应用于嵌套名称说明符 指定其类或命名空间。 在查找前面的名称期间 :: 范围解析运算符, 对象、函数和枚举数名称 被忽略。如果找到的名称不是 类名(第 9 条)或 命名空间名称(7.3.1),程序是 格式不正确。

【讨论】:

    【解决方案2】:

    简短的回答:不。您基本上是在本地覆盖继承的范围,它将使用该本地副本而不是任何继承的副本。

    基本上就像子对象覆盖父对象的函数或变量一样,无论父对象有什么,它都会使用它的副本。

    【讨论】:

    • 它不像类级别的作用域——在这种情况下,有一种语法可以显式引用另一个作用域。
    • 是的,但我只是指默认行为。
    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多