Les membres static de la classe existent en un seul exemplaire pour toute la classe, représentant une valeur commune à tous les objets.
static sont initialisées en dehors de la classe, généralement dans un fichier cpp, en dehors de la classe (int Foo::count = 0;). À l'intérieur de la classe, nous déclarons, puis définissons à l'extérieur.static peuvent être appelées à la fois via la classe et via un objet. Elles n'ont pas accès aux membres d'une instance spécifique (this), ne peuvent se référer qu'à d'autres membres static.class Counter { public: static int count; static void increment() { ++count; } }; int Counter::count = 0; int main() { Counter::increment(); Counter c1, c2; c1.increment(); // count == 2 }
« La définition d'un membre
staticpeut-elle se trouver dans un fichier d'en-tête ? Quels risques cela comporte-t-il ? »
Réponse : Oui, la définition (int Foo::value = 0;) à l'intérieur de l'en-tête est techniquement possible, mais si cet en-tête est inclus dans plusieurs unités de traduction, cela entraînera une duplication (multiple definition), provoquant des erreurs de liaison. Par conséquent, les membres static ne doivent être définis que dans un seul fichier cpp.
Histoire
Dans du code de bibliothèque, un membre
statica été défini directement dans le fichier d'en-tête. L'inclusion multiple a entraîné des erreurs de liaison : "multiple definition of ...". Après avoir déplacé la définition dans un fichier cpp séparé, le problème a été résolu.
Histoire
Dans un projet éducatif, un membre
statica été déclaré, mais sa définition a été omise dans le fichier cpp externe. Malgré l'absence d'erreurs lors de la compilation des en-têtes, une erreur de symbole externe non résolu est survenue lors de la liaison. Il a fallu rechercher et ajouter la définition manquante.
Histoire
Dans un grand système embarqué, l'initialisation d'un membre
staticavec une valeur calculée a été mal réalisée (on a essayé de l'initialiser via une expression nécessitant l'exécution de code). La logique a été déplacée dans une fonction d'initialisation distincte, mais par inadvertance, cette fonction a été oubliée avant le premier accès — le résultat a été des variables non initialisées et un comportement erratique.