Maison >développement back-end >C++ >Pourquoi initialiser les variables membres statiques C en dehors de la déclaration de classe ?

Pourquoi initialiser les variables membres statiques C en dehors de la déclaration de classe ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-25 15:11:21801parcourir

Why Initialize C   Static Member Variables Outside the Class Declaration?

Initialisation des variables membres statiques en C : Pourquoi en dehors de la classe ?

En C, les variables membres statiques sont initialisées en dehors de la déclaration de classe. Cet écart par rapport à l'initialisation en classe, plus intuitive, a suscité la curiosité des développeurs. Y a-t-il une raison logique derrière cette décision de conception ?

La raison fondamentale réside dans l'exigence selon laquelle les membres statiques doivent être définis dans exactement une unité de traduction. Si l'initialisation était autorisée au sein de la classe, elle pourrait conduire à plusieurs définitions de la même variable dans différentes unités de traduction, violant ainsi la règle de définition unique.

Pour illustrer cela, considérons l'exemple suivant :

struct Gizmo {
  static string name = "Foo";
};

Si ce code était autorisé, le nom serait défini dans chaque unité de traduction qui inclut ce fichier d'en-tête. Cela est en conflit avec la règle de définition unique, qui exige qu'une variable ne puisse avoir qu'une seule définition.

Cependant, C fournit un sucre syntaxique qui permet l'initialisation de membres statiques intégraux dans la déclaration :

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

Ceci est autorisé tant que l'expression est un type intégral const ou énumération, peut être évaluée au moment de la compilation et qu'il existe toujours une définition dans une seule unité de traduction qui ne viole pas la règle d’une définition. Par exemple :

// gizmo.cpp
#include "gizmo.h"

const int Gizmo::count;

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