En C++, les classes peuvent avoir des membres statiques et non statiques (variables et fonctions). Ils ont été introduits pour supporter des données communes (pour tous les objets de la classe), ainsi que pour des fonctions qui n'ont pas besoin d'accéder à l'état d'une instance spécifique.
Il est important de distinguer les membres statiques et non statiques, car ils ont des cycles de vie, des portées et des règles d'initialisation différents. Les erreurs fréquentes incluent : définition incorrecte, utilisation simultanée de membres d'instance et statiques, redéfinitions dans les en-têtes.
Les variables statiques de classe sont déclarées à l'intérieur de la classe comme static, mais doivent être définies séparément en dehors de la classe (avant C++17). Elles existent en une seule instance. Les fonctions statiques n'ont pas accès aux membres non statiques (d'instance) sans indication explicite.
Exemple de code :
class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;
Caractéristiques clés :
Peut-on initialiser une variable statique de classe directement dans la classe (avant C++17) ?
Non, avant C++17, un membre statique doit être défini en dehors de la classe. En C++17 et versions ultérieures, pour inline static, une définition peut se faire directement dans la classe.
// C++17 class Foo { inline static int counter = 0; };
Une fonction statique de classe a-t-elle accès à this ou aux membres non statiques ?
Non, les membres statiques n'ont pas accès aux membres non statiques ou à this, même si des instances de la classe sont créées. Pour y accéder, il faut passer explicitement l'objet.
Un membre statique de classe est-il créé pour chaque instance de la classe ?
Non, les membres statiques existent en une seule instance pour toute la classe, indépendamment du nombre d'objets.
Un développeur déclare un static int dans une classe, mais ne le définit pas en dehors de la classe. Le linkeur renvoie une erreur de symbole indéfini, car le membre statique n'a pas été initialisé.
Avantages :
Inconvénients :
Le membre statique est déclaré dans la classe, défini en dehors de la classe, utilisé comme compteur d'objets créés.
Avantages :
Inconvénients :