Variables globales et statiques

Les variables globales sont initialisées par l’appel d’un constructeur avant le début du programme principal (fonction main, voir chapitre 1), et détruites par leur destructeur à la fin de celui-ci (sauf en cas d’interruption forcée du programme par _exit ou abort). Cela fournit un moyen très simple d’exécuter une fonction avant d’entrer dans main :

class init {         // ...     public :     init(long l);     ~init();     } globale(100);				init::init(long l)// fonction exécutée avant le commencement de main{     // ...}				init::~init()// fonction exécutée après la fin du programme{     // ...}

Il existe parfois, selon le compilateur, d’autres moyens d’obtenir ce résultat en utilisant des #pragma (voir chapitre 10), mais celui-ci est à notre avis le plus simple, et aussi le plus portable puisque les constructeurs et destructeurs font partie du langage C++.

Les variables statiques, à l’intérieur des fonctions, sont aussi initialisées par un constructeur et détruites en fin de programme. Cependant, le langage ne précise pas si ces constructeurs doivent être appelés même si la fonction qui contient la variable statique ne l’est jamais, et à quel moment. Par exemple Turbo C++ initialise de telles variables au moment du premier appel de la fonction, mais d’autres compilateurs peuvent éventuellement faire ces initialisations au début du programme. Il est donc préférable de ne pas faire d’hypothèses sur ce point.

Quant aux membres statiques des classes, ils ne sont pas initialisés par un constructeur : leur valeur est mise à zéro, c’est tout, ce qui constitue généralement une erreur, et quelque chose à éviter si ce membre est une instance de classe. Dans ce cas, il existe un mécanisme spécifique, l’héritage (voir chapitre 8) qui permet à une classe de contenir des parties instances d’autres classes. Une autre méthode consiste à utiliser des pointeurs.

Précédent Précédent Sommaire Sommaire Suivant Suivant