Maison >développement back-end >C++ >Pourquoi les membres statiques et les tableaux non constants ne peuvent-ils pas être initialisés dans une définition de classe C ?
La norme C restreint l'initialisation des données statiques membres dans les définitions de classe aux types intégraux ou énumérations constantes statiques uniquement.
class A { static const int a = 3; // Allowed static int b = 3; // Error: Non-const static member cannot be initialized in class definition static const int c[2] = {1, 2}; // Allowed static int d[2] = {1, 2}; // Error: Non-const static array cannot be initialized in class definition };
Cette limitation est due à la manière dont Les données membres statiques sont gérées par le compilateur. Chaque membre de données statiques doit avoir une définition unique, et s'il est initialisé dans la définition de classe, il créera plusieurs définitions lorsque la classe est incluse dans plusieurs unités de traduction.
Tableaux statiques, même les tableaux constants ne peuvent pas être initialisés dans les définitions de classe car leur taille ne peut pas être déterminée au moment de la compilation. Le compilateur nécessite que la taille d'un tableau soit connue avant de pouvoir allouer de la mémoire au tableau.
Pour initialiser des tableaux statiques dans les définitions de classe, une solution de contournement utilisant le Une "astuce enum" peut être utilisée :
class A { static const int a = 3; enum { arrSize = 2 }; static const int c[arrSize] = {1, 2}; };
La restriction de la norme sur l'initialisation des membres statiques non const découle de la nécessité d'éviter les définitions ambiguës et de garantir des définitions de membres uniques dans les unités de traduction.
En ce qui concerne les tableaux statiques, la conception du langage C a donné la priorité à l'efficacité au moment de la compilation, exigeant la taille du tableau à connaître au moment de la compilation pour optimiser l'allocation de mémoire. Cependant, C 11 a introduit le concept d'expressions constantes, permettant l'initialisation de membres de données const avec des valeurs déterminées au moment de la compilation, ce qui peut offrir plus de flexibilité dans les futures versions C.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!