Maison >développement back-end >C++ >Pourquoi l'initialisation des variables membres statiques en C doit-elle se produire en dehors de la classe ?

Pourquoi l'initialisation des variables membres statiques en C doit-elle se produire en dehors de la classe ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-15 00:39:10537parcourir

Why Must Static Member Variable Initialization in C   Occur Outside the Class?

Variables membres statiques en C : initialisation en dehors de la classe

Bien que cela puisse sembler contre-intuitif, l'initialisation des variables membres statiques en C se produit en dehors la classe pour plusieurs raisons logiques.

Règle de définition unique Conformité

Les membres statiques doivent être définis dans exactement une unité de traduction, en respectant la règle de définition unique. Si l'initialisation était autorisée au sein de la classe, cela conduirait à plusieurs définitions de la même variable dans différentes unités de traduction, violant ainsi cette règle.

Exemple :

Considérez ce qui suit extrait de code :

struct Gizmo {
  static string name = "Foo"; // Not allowed
};

Si cette initialisation était autorisée, le nom de la variable serait défini dans chaque unité de traduction incluant le fichier d'en-tête, violer la règle de définition unique.

Autoriser l'initialisation en classe

Bien qu'autoriser l'initialisation au sein de la classe puisse sembler plus intuitif, cela nécessiterait néanmoins une définition distincte pour garantir que la règle de définition unique est appliquée. Ainsi, autoriser l'initialisation en classe ne ferait qu'ajouter de la syntaxe sans apporter de réel avantage.

Alternative pour les valeurs intégrales

Pour les membres statiques intégraux, C permet l'initialisation dans la déclaration si l'expression est :

  • Type intégral ou énumération Const
  • Évaluable à au moment de la compilation

Cela permet un raccourci syntaxique qui facilite la définition de membres statiques intégraux avec une seule ligne de code. Cependant, une définition dans une unité de traduction distincte est toujours requise.

Exemple :

struct Gizmo {
  static const int count = 42; // Allowed
};

Dans ce cas, le compilateur génère la définition nécessaire en dehors de la classe pour se conformer à la règle d'une définition unique.

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!

Déclaration:
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