【问题标题】:confused with ::function statement与 ::function 语句混淆
【发布时间】:2014-02-24 05:17:25
【问题描述】:

我在 VS C++ 中看到过代码示例,例如 ::function(),但我无法理解它的含义。

我知道 :: 用于从类外部访问成员函数,但我看到了我没有找到这种情况的示例。例如在下面的代码中

// For painting in memory
class MemCanvas: public Canvas
{
public:
    MemCanvas (HDC hdc) 
        : Canvas (::CreateCompatibleDC (hdc))
    {}

    ~MemCanvas ()
    {
        ::DeleteDC(_hdc); 
    }
};

查看 ::CreateCompatibleDC() 函数!! 我知道它是在 Windows.h 中定义的,但我无法猜测它是如何在这里定义的。

【问题讨论】:

  • 一元 :: 指的是全局命名空间。
  • NamespaceName::XClassName::X 用于访问命名空间或类的成员。 ::X 用于访问全局命名空间的成员(文件范围内的所有内容都属于无名命名空间,除非明确放置在某个命名命名空间或类中)
  • 问题是关于类而不是函数,但您可能仍然会发现我的回答 here 很有用。
  • 提供的代码示例不完整,因此假设了一些事实。 ::CreateCompatibleDC() 在某些包含(windows.h)中定义和声明,这些包含可能在使用的类的头文件中提到。正如@chris 所提到的,“::”指的是全局命名空间。所以基本上你在全局命名空间中搜索 CreateCompatibleDC 而不是当前或其他命名空间。注意 ::CreateCompatibleDC() 在这里没有定义为你的问题中所说的,它只是从你的初始化参数列表中调用的。基类 Canavas 构造函数使用 ::CreateCompatibleDC() 的结果作为其参数
  • 您似乎明白:: 的含义,那么您对这段代码到底有什么不明白的地方呢? ::CreateCompatibleDC() 调用具有在全局命名空间中声明的名称的函数;该函数调用的结果被传递给Canvas 构造函数。

标签: c++ winapi


【解决方案1】:

:: 指的是全局命名空间。

作为函数调用的前缀,它表示这不是一个成员函数,它是一个全局命名空间函数。

与 Windows API 函数的命名约定一起,它几乎可以识别 Windows API 函数。给读者。通常没有命名冲突,因此编译器不需要它:它只是一个与代码阅读器通信的设备。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多