【问题标题】:what does "::'variable'" refer to?“::'变量'”指的是什么?
【发布时间】:2011-08-15 13:43:06
【问题描述】:

以下程序中的 ::i 是什么意思?

#include<iostream>
using namespace std;
int i = 10;
int main(){
   int i = 20;
   {
   int i = 30;
   cout << i << ::i <<endl;
   }
}

它输出“3010”。 "::i" 似乎是指全局声明。具体是什么意思?

【问题讨论】:

    标签: c++ scope


    【解决方案1】:

    它被称为限定名称查找。
    它引用了在全局范围内声明的变量i
    简单来说就是不要引用局部变量i(如果有的话),而是在全局范围内引用i

    当你在本地范围内有相同的命名变量时,当引用变量名时,优先考虑本地范围内的变量。这意味着在您的程序中,局部范围内的 i { } 隐藏了所有其他名为 i 的变量,即那些(i=20i=10)。因此,要引用全局范围内的i,请使用:: 范围解析运算符。=

    【讨论】:

    • 也许您还可以解决第一个本地i 被第二个隐藏的问题; OP 可能想知道为什么 ::i 没有得到外部本地 i
    • @Kerrek SB:哦,回复评论有点晚了,但已经完成了。感谢您的评论。
    【解决方案2】:

    :: 运算符开头的变量和函数描述该变量或函数在全局命名空间中(非本地)。在您的示例中,i 表示在第 7 行定义的局部变量,::i 表示在第 3 行定义的全局变量。但是i 没有引用在第 5 行定义的外部局部变量,因为它在该范围内(第 6 到 9 行)被重新定义并且无法访问。

    【讨论】:

      【解决方案3】:

      :: 运算符是scope resolution operator。当您编写scopename::name 时,这意味着您将名为name 的对象/函数/... 引用到范围scopename(通常是命名空间)中;例如,如果你没有写 using namespace std; 来使用 cin/cout/... 你将不得不写 std::cin/std::cout/...

      如果范围解析运算符前面没有范围名称,则意味着您明确引用了放入全局命名空间中的对象,因为全局 i 在您的程序中。

      如果您当前已导入多个命名空间(使用using namespace 指令)或具有隐藏全局名称的本地名称,这将特别有用。在您的代码中,这正是发生的情况:本地 i“隐藏”了全局,而您需要 :: 才能访问全局 i

      随机提示:当您处理 C 库(没有命名空间的概念)时,您经常会看到 :: 用于引用全局标识符,并且您希望确定自己'正在调用一个特定的 C 函数,而不是一些将其隐藏到当前范围内的 C++ 方法(这在想要调用 Windows API 的 MFC 代码中经常发生)。

      【讨论】:

      • @Macke:我在写答案的时候突然想到它;实际上,这是我看到的唯一一个实例,其中:: 运算符被大量用于引用全局命名空间中的内容。
      【解决方案4】:

      i 在全局命名空间中。

      {
        int i = 30;
        cout << i << ::i <<endl;
      
        // 1. First i refers to the block scoped i having value 30
        // 2. ::i refers to the global variable i having the value 10
      }
      

      【讨论】:

        【解决方案5】:

        ::i 指的是全局命名空间中的i

        【讨论】:

          【解决方案6】:

          它只是一个作用域运算符。它通常用于命名空间。

          【讨论】:

            【解决方案7】:

            ::i 指的是全局变量。

            :: 用于全局命名空间。所以::i 表示在全局命名空间中声明的变量i

            【讨论】:

              【解决方案8】:

              ::i 表示搜索i,它没有嵌套在任何东西中。在您的情况下,这将引用 i=10; 以及 see c/c++ search wildcard and syntax

              【讨论】:

                猜你喜欢
                • 2023-03-10
                • 1970-01-01
                • 1970-01-01
                • 2015-01-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-11-11
                相关资源
                最近更新 更多