Maison > développement back-end > C++ > Pourquoi les membres statiques non constants ou les tableaux statiques ne peuvent-ils pas être initialisés dans une définition de classe en C ?

Pourquoi les membres statiques non constants ou les tableaux statiques ne peuvent-ils pas être initialisés dans une définition de classe en C ?

Linda Hamilton
Libérer: 2024-12-06 05:00:11
original
281 Les gens l'ont consulté

Why Can't Non-Const Static Members or Static Arrays Be Initialized Inside a Class Definition in C  ?

Pourquoi les membres statiques non constants ou les tableaux statiques ne peuvent-ils pas être initialisés dans une classe ?

Au sein d'une classe, les membres de données statiques peuvent ne peuvent être initialisés que s'ils sont constants et de type intégral. Cette restriction découle de l'exigence de la norme C selon laquelle chaque objet a une définition unique.

Initialisation des membres statiques non const :

Selon la norme C (C 03 9.4 .2), les données membres statiques de types non const ne peuvent pas être initialisées dans la définition de classe. Le code suivant illustre ceci :

class A {
    static int b = 3;
};
Copier après la connexion

Ce code viole la norme et produira une erreur, car le membre statique b n'est pas const et tente de l'initialiser au sein de la classe.

Initialisation de tableaux statiques :

De même, les tableaux statiques ne peuvent pas être initialisés dans une définition de classe, même s'ils le sont const. Cela est dû au fait que les tableaux statiques sont stockés en mémoire en tant qu'objets. En tant que tels, ils ne peuvent pas être initialisés dans la définition de classe, car cela violerait l'exigence de définitions uniques.

class A {
    static const int c[2] = { 1, 2 };
};
Copier après la connexion

Encore une fois, ce code viole la norme et produira des erreurs.

Solution de contournement et raisons :

Une solution de contournement pour initialiser un tableau statique au sein d'une classe consiste à utiliser "l'astuce enum", comme suit :

class A {
    static const int a = 3;
    enum { arrsize = 2 };

    static const int c[arrsize] = { 1, 2 };
};
Copier après la connexion

La raison derrière l'interdiction de l'initialisation en classe des données membres statiques est liée au fait que les fichiers d'en-tête contenant des déclarations de classe sont généralement inclus dans plusieurs unités de traduction. Pour éviter les problèmes d'éditeur de liens, C exige que chaque objet ait une définition unique. Si l'initialisation en classe des entités résidentes en mémoire était autorisée, cette règle serait enfreinte.

Cependant, en C 11, la restriction a été assouplie dans une certaine mesure. Si une donnée membre statique est d'un type littéral const, elle peut être initialisée à l'aide d'une accolade ou d'un initialiseur égal dans la définition de classe. De plus, les données membres non statiques peuvent désormais être initialisées au moment de la déclaration. Ces fonctionnalités ne sont pas encore entièrement implémentées dans tous les compilateurs, comme gcc 4.7.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal