Un certain temps est nécessaire pour créer un objet. Un certain temps est nécessaire pour tuer un objet. Lorsque vous parlez d'un objet, deux choses sont impliquées: l'emplacement qui est le stockage et la valeur. La signification de la durée de vie et de stockage est similaire; Mais la durée est plus visible du point de vue de l'emplacement que du point de vue de la valeur. La durée de stockage est l'heure à partir duquel un emplacement est associé à un objet au moment où l'emplacement est dissocié de l'objet.
Le reste de cet article illustre la durée de vie de l'objet et explique brièvement les différentes durées de stockage. Vous devriez avoir des connaissances de base en C ++ afin de comprendre cet article. Vous devriez également avoir des connaissances dans la portée C ++.
Contenu de l'article
Illustration de la durée de vie des objets
Considérez le programme suivant:
#inclure
Utilisation de Namespace Std;
int main()
si (1 == 1)
int x;
x = 1;
char y;
y = 'a';
couter << x << y << '\n';
retour 0;
La sortie est, 1A .
La vie d'un objet prend fin, quand elle sort de portée. La durée de vie de l'objet x, commence à «x = 1;» et se termine à la fin du scope if-local. La durée de vie de l'objet y commence à «y = 'a»; » et se termine à la fin du scope if-local. Avant que les deux objets ne meurent, ils sont employés dans la déclaration COUT .
Durée de stockage
La durée de stockage est déterminée par l'un des schémas suivants: Durée de stockage automatique; durée de stockage dynamique; durée de stockage statique; durée de stockage du thread. Catégories de durée de stockage, s'appliquent également aux références.
Durée de stockage automatique
Si une variable n'est pas déclarée explicitement comme statique, thread_local ou externe, cette variable a une durée de stockage automatique. Les exemples sont X et Y ci-dessus. La durée de ces variables se termine lorsqu'ils sortent de la portée. Le programme suivant illustre la durée automatique du stockage pour une référence et un pointeur, dans la portée globale.
#inclure
Utilisation de Namespace Std;
int x = 1;
int & m = x;
char y = 'a';
char * n = & y;
int main()
couter << m << *n << '\n';
retour 0;
La sortie est, 1A .
La durée de m commence à partir de «int & m = x;» et se termine à la fin du programme. La durée de N commence à partir de «char * n = & y;» et se termine à la fin du programme.
Durée de stockage dynamique
Magasin gratuit
Dans un ordinateur moderne, plus d'un programme peut fonctionner en même temps. Chaque programme a sa propre partie de la mémoire. Le reste de la mémoire qui n'est utilisé par aucun programme, est connu sous le nom de magasin gratuit. L'expression suivante est utilisée pour retourner un emplacement pour un entier dans le magasin gratuit
Nouveau Int
Cet emplacement (stockage) pour l'entier, retourné, doit toujours être identifié par affectation à un pointeur. Le code suivant illustre comment utiliser le pointeur avec un magasin gratuit:
int * ptrint = new int;
* ptrint = 12;
couter<< *ptrInt <<'\n';
La sortie est 12 .
Pour mettre fin à la durée de vie de l'objet, utilisez l'expression de suppression comme suit:
supprimer des ptrints;
L'argument pour l'expression de suppression est un pointeur. Le code suivant illustre son utilisation:
int * ptrint = new int;
* ptrint = 12;
supprimer des ptrints;
Un pointeur créé avec la nouvelle expression et supprimé avec l'expression de suppression, est d'une durée de stockage dynamique. Ce pointeur meurt au fur et à mesure de sa portée, ou est supprimé. La durée de l'objet dans le code précédent commence à «* ptrint = 12;» et se termine à la fin de la région déclarative (portée). Il y a plus dans les expressions nouvelles et supprimées que ce qui a été discuté ici - voir plus tard.
Durée de stockage statique
Objet statique
Un objet déclaré statique, se comporte comme l'objet ordinaire, sauf que sa durée de stockage commence à partir du moment où il est initialisé à la fin du programme. Il ne peut pas être vu en dehors de sa portée, mais il peut indirectement être utilisé de l'extérieur de sa portée.
Considérez le programme suivant, qui est censé compter de 1 à 5 (ne pas tester le programme):
#inclure
Utilisation de Namespace Std;
int fn ()
int stc = 1;
couter << " << stc;
stc = stc + 1;
if (stc> 5)
retour 0;
fn ();
int main()
fn ();
retour 0;
La sortie est 1 1 1 1 1 1 1 1… et ne terminait jamais vraiment. La définition de la fonction est une fonction récurrente; ce qui signifie qu'il continue de s'appeler jusqu'à ce qu'une condition soit remplie.
La solution consiste à rendre l'objet STC statique. Une fois qu'un objet statique a été initialisé, sa valeur ne peut pas être modifiée jusqu'à la fin du programme. Le programme suivant (que vous pouvez tester), qui est le même que ce qui précède, mais maintenant avec STC, rendu statique, compte de 1 à 5:
#inclure
Utilisation de Namespace Std;
int fn ()
static int stc = 1;
couter << " << stc;
stc = stc + 1;
if (stc> 5)
retour 0;
fn ();
int main()
fn ();
retour 0;
La sortie est: 1 2 3 4 5 .
Remarque: la durée d'un objet statique commence lorsque l'objet a été initialisé et se termine à la fin du programme. En attendant, l'objet peut être utilisé indirectement, à partir d'une portée différente. Une fois qu'un objet statique a été initialisé, sa valeur initiale ne peut pas être modifiée, même si sa définition est réévaluée. Dans le code ci-dessus, le STC n'est pas réinitialisé, la prochaine fois qu'il sera appelé. La prochaine fois qu'il sera appelé, il est incrémenté par «STC = STC + 1;».
Membre de données statique
Un ensemble de variables et de fonction connexes peut être placée dans une unité généralisée appelée classe. Si les variables reçoivent des valeurs particulières, la classe devient un objet. Cependant, un objet n'est pas créé en attribuant simplement des valeurs à la variable. La classe est instanciée pour obtenir un objet; Et chaque objet créé a son propre nom différent des autres objets de la même classe. Le programme suivant montre une classe, appelée TheCla et un objet, appelé OBJ; Il montre également comment l'objet est instancié et utilisé dans la fonction principale ():
#inclure
Utilisation de Namespace Std;
classe TheCla
public:
int num;
void func (char cha, const char * str)
couter << "There are " <<
nobs << " books worth " <<
cha << str << " in the store." << '\n';
;
int main()
Thecla obj;
obj.num = 12;
obj.func ('$', "500");
retour 0;
La sortie est:
Il y a 12 livres d'une valeur de 500 $ dans le magasin.Remarquez que pour attribuer la valeur de 12 à la variable Num, l'objet doit être instancié, avant que l'affectation puisse avoir lieu. Il est possible pour le programmeur d'attribuer la valeur sans instancier (créant) un objet. Pour y parvenir, la variable, num devra être déclarée statique. Ensuite, il sera accessible comme «thecla :: num» sans le nom de l'objet, mais avec le nom de classe. Le programme suivant illustre ceci:
#inclure
Utilisation de Namespace Std;
classe TheCla
public:
const statique int int num = 12;
void func (char cha, const char * str)
couter << "There are " << num <<
"Les livres valent" << cha << str <<
" dans le magasin." << '\n';
;
int main()
couter << TheCla::num << '\n';
Thecla obj;
obj.func ('$', "500");
retour 0;
La sortie est:
12Notez que pour accéder au membre de données, num dans main (), l'opérateur de résolution de portée, :: a dû être utilisé. Pas non plus que la variable, NUM devait être rendue constante et initialisée dans la description de la classe (définition).
Fonction de membre statique
Remarquez que dans la liste des programmes précédents ci-dessus, afin d'utiliser la fonction FUNC dans Main (), un objet devait être instancié. Il est possible pour le programmeur d'appeler la fonction sans instancier (créer) un objet. Pour y parvenir, la définition de la fonction doit être précédée du mot «statique». Ensuite, il sera accessible comme «thecla :: func ()» sans le nom de l'objet, mais avec le nom de la classe. Le programme suivant l'illustre pour les membres de données statiques et la fonction des membres statiques:
#inclure
Utilisation de Namespace Std;
classe TheCla
public:
const statique int int num = 12;
STATIC VOID FUNC (Char Cha, const char * str)
couter << "There are " << num <<
"Les livres valent" << cha << str <<
" dans le magasin." << '\n';
;
int main()
Thecla :: func ('$', "500");
retour 0;
La sortie est:
Il y a 12 livres d'une valeur de 500 $ dans le magasin.Durée de stockage du thread
Le thread comme une fonctionnalité en C ++, n'a pas encore été implémenté par le compilateur G ++. Ainsi, au lieu d'expliquer cela, la citation de la spécification C ++ est donnée comme suit:
Conclusion
La durée de vie d'un objet commence lorsque son initialisation est terminée et se termine lorsque son stockage est libéré. La durée de stockage dynamique démarre lorsque le stockage créé par (nouveau type) est initialisé et se termine lorsque l'objet sort de portée ou est supprimé par «Supprimer le pointeur». La durée d'un objet statique commence lorsque l'objet a été initialisé et se termine à la fin du programme. Une fois qu'un objet statique a été initialisé, sa valeur initiale ne peut pas être modifiée, même si sa définition est réévaluée. Les membres de données statiques et les membres de la fonction statique sont accessibles en dehors de la description de la classe avec «ClassName :: Nom».