类名(声明)后的双冒号 - 这是什么意思

double colon after class name (declaration) - what does that mean?

本文关键字:是什么 意思 声明 类名      更新时间:2023-10-16

我一直想知道以下内容是什么意思(代码片段取自cppreference pimpl(

class widget::impl {
      ^^^^^^^^^^^^
   ...
};

a_class::another_class是什么意思?这是一个命名空间吗?或者这是一个被宣布为主类之外的内部类?

或者这是一个被宣布为主类之外的内部类?

宾果游戏。需要明确的是,iit 实际上是在封闭类之外定义的内部类。

如果您希望一个类具有对类的类似成员的访问权限作为实现详细信息,但又不想将该嵌套类的定义发布到类的客户端,这是一个方便的技巧。

::运算符是范围解析运算符。它限定表达式的范围。在您的情况下,它限定表达式class impl的作用域为 widget ,即属于 widget 的类impl。考虑以下示例,它定义了不同作用域的两个impl类:

// global impl
class impl;
class widget
{
    // widget's impl
    class impl;
};
class widget::impl
{
    // Define widget's impl
};
class impl
{
    // Define global impl
};

范围解析运算符允许您清楚地声明要定义的类。

它是一个内部类。

 class Widget
  {
    // ...
  private:
    class impl;           
  };
  // Then, typically in a separate implementation file:
  class Widget::impl
  {
  public:
    // ...
    T1 t1_;
    T2 t2_;
  };

可以是内部类的前向声明,例如:

class A{
 class B;
};
class A::B {
};