为什么::(范围)与空的左操作数一起使用?

时间:2011-12-30 12:30:24

标签: c++ scope operator-keyword

我现在已经看过几次了,我一直在想我为什么......

例如:(http://www.codeguru.com/forum/showthread.php?t=377394)

void LeftClick ( )
{  
  INPUT    Input={0};
  // left down 
  Input.type      = INPUT_MOUSE;
  Input.mi.dwFlags  = MOUSEEVENTF_LEFTDOWN;
  ::SendInput(1,&Input,sizeof(INPUT));

  // left up
  ::ZeroMemory(&Input,sizeof(INPUT));
  Input.type      = INPUT_MOUSE;
  Input.mi.dwFlags  = MOUSEEVENTF_LEFTUP;
  ::SendInput(1,&Input,sizeof(INPUT));
}

这个例子在没有::(范围)运算符的情况下工作,为什么它们甚至在那里?

6 个答案:

答案 0 :(得分:26)

这基本上意味着“获取GLOBAL范围的功能,而不是当前可见的功能”。

void SendInput() { /* (1) */
}

namespace derp {
    void SendInput() { /* (2) */
    }

    void LeftClick() {
        ...
        ::SendInput(); /* matches (1) */
        SendInput();  /* matches (2) */
    }
}

答案 1 :(得分:3)

假设您有以下内容:

void bar()
{
}

struct Foo
{
    void bar();
};

如果要从成员函数bar调用全局函数Foo::bar,请使用空左侧的语法:

void Foo::bar()
{
    // Call the global bar function, not recursively call myself
    ::bar();
}

答案 2 :(得分:2)

强制进行绝对名称解析 如果没有它,则会针对类/函数命名空间路径搜索名称解析。

因此假设LeftClick()位于命名空间层次结构中:

namespace Level1
{
    namespace Level2
    {
        namespace Level3
        {
            LeftClick()
            {
                 ::SendInput();   // Absolute path only. SendInput in global namespace
                 SendInput();     // Relative path (Note resolved at compile time)
                                  //
                                  // Looks for the function here (in this order)
                                  //    ::Level1::Level2::Level3::SendInput()
                                  //    ::Level1::Level2::SendInput()
                                  //    ::Level1::SendInput()
                                  //    ::SendInput()
            }
        }
    }
}

如果您有一个嵌套名称,那就更有趣了:

namespace Level1
{
    namespace Level2
    {
        namespace Level3
        {
            LeftClick()
            {
                 ::Test::Action();  // Absolute Path: Function Action() 
                                    //                in namespace Test 
                                    //                in global namespace

                 Test::Action();    // Relative Path: Function Action()
                                    //                in namespace Test
                                    //                in current namespace path.
                                    //
                     // It will Look for Test (in this order)
                     // ::Level1::Level2::Level3::Test
                     // ::Level1::Level2::Test
                     // ::Level1::Test
                     // ::Test
                     //
                     // In the first Test (and only the first) it finds it will 
                     // try and resolve the Action() function. If it is not there
                     // it is a compile time error.
            }
        }
    }
}

答案 3 :(得分:1)

强制将符号放在全局范围内。

void foo() {} // 1

namespace A
{
    void foo() {} // 2

    void bar()
    {
        foo(); // 2
        ::foo(); // 1
    }
}

答案 4 :(得分:0)

以这种方式使用范围运算符意味着您指的是全局范围。

为了节省宝贵的时间和按键,请查看scope resolution operator without a scope

答案 5 :(得分:0)

::用于直接从对象外部访问对象。