2017-09-12 3 views
0

J'ai trouvé une construction de code, je n'en ai jamais vu auparavant et je ne sais pas comment elle s'appelle. Quelqu'un peut-il me l'expliquer? Je n'ai pas pu le trouver via google ni dans ce forum.Pourquoi le nom de classe est-il utilisé avant le nom de la variable avec "::"?

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; 
    } 
} 

Pourquoi y at-il la classe avant la variable avec ::?

CModule CModule::Instance; 

je vais changer le titre et préciser ma question, quand je sais comment on appelle cela.

+4

Lisez à propos des variables 'static' et de leur utilisation. – CinCout

+0

Google "initialisation des membres statiques C++" –

+2

Cela s'appelle un nom qualifié. Pls vous faire une faveur et obtenir un livre sur C++. – rustyx

Répondre

0

Qu'est-ce que vous avez découvert est l'instanciation d'une variable de classe statique.

Jusqu'à présent, une variable statique provenant d'une classe devait être instanciée en dehors de la classe dans laquelle elle avait été déclarée. L'instanciation est effectuée de la même manière que la déclaration d'une variable normale.

Donc d'abord il y a le type de la variable CModule, puis le nom de la variable CModule::Instance;. Comme cette variable provient de l'intérieur d'une classe, pour l'identifier correctement, elle doit être préfixée par le nom de la classe. Le nom de la classe d'origine et le nom de la variable sont séparés par ::.

Depuis C++ 17:

Un élément de données statique peut être déclarée inline. Un membre de données inline static peut être défini dans la définition de classe et peut spécifier un initialiseur de membre par défaut. Il n'a pas besoin d'une définition hors-classe ...

0

Ce que vous regardez est connu comme un static membre de la classe:

membres statiques d'une classe ne sont pas associés aux objets de la classe: ils sont des objets indépendants avec une durée de stockage statique ou fonctions régulières définies dans la portée de l'espace de noms, une seule fois dans le programme. Le mot-clé statique est utilisé avec la déclaration d'un membre statique, dans la définition de la classe, mais pas avec la définition de ce membre statique:

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

Comme vous pouvez le voir dans cet exemple, lorsque la variable est marqué statique, il est défini en dehors de la classe (sauf pour les types intégrales tels que int). Ainsi, dans votre code, la static CModule Instance; est définie en dehors de la classe, où la définition appelle le constructeur par défaut de la classe CModule comme suit:

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