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
?
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).
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;
};