web-dev-qa-db-fra.com

Quelle est la bonne façon d'initialiser des membres de données statiques en C ++ (98, 11 et 14)

Quelle est la bonne façon d'initialiser les membres de données static en C++? Je suis également intéressé par la façon dont il est passé de C++ 98 à C++ 11 en C++ 14.

Voici un exemple:

// bufferedOutput.h
class BufferedOutput
{
 // Static member declaration.
 static long bytecount;
};

// bufferedOutput.cpp
long BufferedOutput::bytecount = 50;

Y a-t-il d'autres façons d'initialiser les membres de données static?

28
bodacydo

Les règles ont toujours été les suivantes:

  • Un membre de données statiques (SDM) const de type intégral ou énumération peut être initialisé en classe avec une expression constante.

  • Un constexpr SDM doit être initialisé en classe avec une expression constante.

    C++ 17 n'a plus besoin d'un initialiseur lorsque le constructeur par défaut initialise chaque membre. De plus, constexpr les SDM sont des variables implicitement en ligne, ce qui fait de leur déclaration une définition (les définitions externes sont désormais obsolètes).

  • D'autres types de SDM peuvent avoir un initialiseur dans leur définition (qui est en classe si ce SDM est déclaré inline).

Rien n'a sensiblement changé entre C++ 03 et C++ 11 + pour un code valide dans les deux langues.

Notez que pour les SDM qui ne sont pas en ligne, la déclaration en classe n'est pas une définition - indépendamment du fait qu'un initialiseur soit fourni ou non - et ils doivent être définis s'ils sont utilisés par odr.

Depuis C++ 17, nous pouvons rendre votre SDM inline, ce qui fait de sa déclaration en classe une définition:

class BufferedOutput
{
  static inline long bytecount = 50;
};
35
Columbo