【问题标题】:Why is class name used before the variable name together with "::"?为什么在变量名之前使用类名和“::”?
【发布时间】:2017-09-12 10:49:04
【问题描述】:

我找到了一个代码构造,我以前从未见过,我不知道它是如何调用的。有人可以向我解释吗?我无法通过谷歌或在此论坛中找到它。

模块.cpp

namespace NSModule
{
    CModule CModule::Instance;    //Global in this namespace
}

模块.hpp

namespace NSModule
{
   class CModule
   {
       public:
           /* Some methods and such stuff */

       private:
           static CModule Instance;
   }
}

为什么变量之前的类和 :: 一起存在?

CModule CModule::Instance;

当我知道如何调用时,我将更改标题并指定我的问题。

【问题讨论】:

  • 了解static 变量以及它们的使用方式。
  • 谷歌“静态成员 c++ 的初始化”
  • 称为限定名。请帮自己一个忙,买一本关于 C++ 的书。
  • @RustyX - 有效评论,但应包括 this link

标签: c++ object static


【解决方案1】:

您发现的是静态类变量的实例化。

到目前为止,一个类内部的静态变量必须在声明它的类之外实例化。 实例化的方式与声明普通变量的方式相同。

所以首先是变量CModule的类型,然后是变量名CModule::Instance;

因为这个变量来自一个类内部,为了正确识别它,它必须以类名作为前缀。源类名和变量名用::隔开。

C++17 起:

静态数据成员可以声明为inlineinline static 数据成员可以在类定义中定义,并且可以指定默认成员初始值设定项。它不需要类外定义...

【讨论】:

    【解决方案2】:

    您正在查看的是 static 类成员:

    类的静态成员不与类的对象相关联:它们是具有静态存储持续时间的独立对象或在命名空间范围内定义的常规函数​​,在程序中只有一次。 static 关键字仅与类定义中的静态成员声明一起使用,而不与该静态成员的定义一起使用:

    class X { static int n; }; // declaration (uses 'static')
    int X::n = 1;              // definition (does not use 'static')
    

    正如您在他们的示例中看到的,当变量被标记为静态时,它被定义在类外部(除非用于整数类型,例如int)。因此,在您的代码中,static CModule Instance; 是在类外部定义的,其中定义调用类 CModule 的默认构造函数,如下所示:

      CModule  CModule::  Instance;
    //type     class name variable name 
    

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 2019-03-27
      • 2011-06-11
      • 2012-04-28
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 2023-04-02
      相关资源
      最近更新 更多