Initialisation en classe des membres de données statiques
En C++, static
les membres ne peuvent pas être initialisées dans le corps de la classe avec les exceptions suivantes:
static
membres deconst
type intégral peut êtrestatic
membres deconstexpr
type de littéral doit être
Pouvez-vous expliquer pourquoi ces exceptions?
Aussi, c'est:
Même si un
const static
membre de données est initialisée dans le corps de la classe, que membre ordinaire doit être défini en dehors de la définition de la classe.
Présent je n'ai jamais compris. Quel est le point à cette définition?
Juste essayer d'obtenir quelques intuitions ici.
source d'informationauteur 7cows
Vous devez vous connecter pour publier un commentaire.
Pourquoi peut-il y avoir un initialiseur dans la définition de classe?
Concernant les deux exceptions pour
const
etconstexpr
données membres statiques:[classe.statique.données]/3
I. e. avec un initialiseur, vous pouvez les utiliser dans des expressions constantes, par exemple
Si
len
n'était pas initialisé dans la définition de la classe, le compilateur ne pouvait pas facilement connaître sa valeur dans la ligne suivante pour définir la longueur dearr
.On pourrait argumenter sur le fait de laisser les initialiseurs pour des non-
const
nonconstexpr
données membres statiques dans la définition de classe, mais cela pourrait interférer avec l'ordre d'initialisation:[de base.commencer.init]/2
Qui est, l'ordre des définitions, y compris les initialiseurs est important. L'ordre de (dynamique) de l'initialisation de la non-local des objets est défini à l'intérieur d'une unité de traduction, c'est une autre raison pourquoi il doit y avoir une définition dont l'initialiseur pour les non-
const
nonconstexpr
des données membres statiques.Quel est le point à cette définition?
Cela a déjà été répondu dans les commentaires de l'OMI. Vous pouvez ajouter l'ODR, c'est un nom avec une liaison externe, la donnée membre statique doit seulement être défini dans une unité de traduction (si c'est ODR-utilisé). C'est au programmeur de choisir cette unité de traduction.