为什么在变量名称之前使用类名与“::”一起使用?

时间:2017-09-12 10:49:05

标签: c++ object static

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

module.cpp

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

module.hpp

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

       private:
           static CModule Instance;
   }
}

为什么变量前面的类和::一起?

CModule CModule::Instance;

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

2 个答案:

答案 0 :(得分:0)

您所看到的是static班级成员:

  

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

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

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

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

答案 1 :(得分:0)

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

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

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

因为此变量来自类内部,为了正确识别它,必须以类名作为前缀。原始类名称和变量名称由::分隔。

从C ++ 17开始:

  

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