Les constantes définies avec const voient leur espace libéré après avoir dépassé leur portée, tandis que les constantes statiques définies avec static ne libèrent pas leur espace de stockage après l'exécution de la fonction.
static signifie statique. Les fonctions membres statiques et les variables membres statiques d'une classe sont associées à la classe, et non à des objets spécifiques de la classe. Même sans objet spécifique, les fonctions membres statiques et les variables membres de la classe peuvent être appelées. Généralement, une fonction statique d'une classe est presque une fonction globale, sauf que sa portée est limitée au fichier qui la contient.
En C++, les variables membres statiques ne peuvent pas être initialisées à l'intérieur de la classe. À l'intérieur de la classe, il n'y a qu'une déclaration ; la définition doit être en dehors du corps de définition de la classe, généralement initialisée dans le fichier d'implémentation de la classe, par exemple :double Account::Rate = 2.25;
Le mot-clé static ne peut être utilisé que dans la déclaration à l'intérieur du corps de définition de la classe ; il ne peut pas être marqué comme static lors de la définition.
En C++, les variables membres const ne peuvent pas non plus être initialisées au niveau de la définition de la classe ; elles ne peuvent être initialisées que via la liste d'initialisation du constructeur, et un constructeur doit exister.
Un membre de données const n'est constant que pendant la durée de vie d'un objet particulier, mais il est variable pour l'ensemble de la classe. Comme une classe peut créer plusieurs objets, différents objets peuvent avoir des valeurs différentes pour leurs membres de données const. Par conséquent, les membres de données const ne peuvent pas être initialisés dans la déclaration de classe, car lorsqu'un objet de la classe n'a pas encore été créé, le compilateur ne sait pas quelle est la valeur du membre de données const.
L'initialisation des membres de données const ne peut se faire que dans la liste d'initialisation du constructeur de la classe. Pour établir une constante qui reste constante dans toute la classe, vous devez utiliser une constante enum dans la classe, ou static const.
Le principal objectif des fonctions membres const est d'empêcher les fonctions membres de modifier le contenu de l'objet. C'est-à-dire qu'une fonction membre const ne peut pas modifier les valeurs des variables membres, mais elle peut accéder aux variables membres. Lorsqu'une fonction membre est appelée sur un objet const, cette fonction ne peut être qu'une fonction membre const.
Le principal objectif des fonctions membres statiques est de servir de fonctions globales dans la portée de la classe. Elles ne peuvent pas accéder aux membres de données non statiques de la classe. Les fonctions membres statiques d'une classe n'ont pas de pointeur this, ce qui entraîne :
- 1. Ne peut pas accéder directement aux variables membres non statiques de la classe ni appeler des fonctions membres non statiques.
- 2. Ne peut pas être déclarée comme virtual.
Sur l'initialisation des membres static, const, static const et const static
1. Initialisation des membres const dans une classe :
Lors de la création d'un const dans une classe, vous ne pouvez pas lui donner de valeur initiale.
2. Initialisation des membres statiques dans une classe :
Les variables statiques d'une classe appartiennent à la classe, et non à un objet spécifique. Elles n'ont qu'une seule copie pendant toute l'exécution du programme. Par conséquent, elles ne peuvent pas être initialisées lors de la définition d'un objet ; c'est-à-dire qu'elles ne peuvent pas être initialisées avec un constructeur. La méthode d'initialisation correcte est :
data type class name::static data member name = value;
Cela indique :
- 1. L'initialisation est effectuée en dehors du corps de la classe, et static n'est pas ajouté devant, pour éviter toute confusion avec les variables ou objets statiques ordinaires.
- 2. Lors de l'initialisation, n'ajoutez pas les spécificateurs de contrôle d'accès du membre tels que private, public, etc.
3. Initialisation des membres static const et const static dans une classe
Ces deux façons d'écrire ont le même effet. Pour faciliter la mémorisation, une seule méthode générale d'initialisation est expliquée ici :
Exemple complet
Exemple
Emplacement de l'initialisation
Les membres statiques ne peuvent pas être initialisés dans la définition de la classe (sauf pour int). Ils ne peuvent pas être initialisés dans le fichier d'en-tête.
Par exemple, si myclass.h est défini, il est généralement initialisé dans myclass.cpp.
Membres statiques des classes C++ (static)
Les membres statiques sont proposés pour résoudre le problème du partage de données. Il existe de nombreuses façons de réaliser le partage, comme définir des variables globales ou des objets, par exemple. Cependant, les variables globales ou les objets ont des limites. Dans ce chapitre, nous discutons principalement de l'utilisation de membres statiques d'une classe pour réaliser le partage de données.
Membre de données statique
Dans une classe, les membres statiques peuvent réaliser le partage de données entre plusieurs objets, et l'utilisation de membres de données statiques ne rompt pas le principe de masquage, garantissant ainsi la sécurité. Par conséquent, les membres statiques sont des membres partagés par tous les objets de la classe, et non des membres d'un objet particulier.
L'utilisation de membres de données statiques peut économiser de la mémoire, car ils sont communs à tous les objets. Par conséquent, pour plusieurs objets, les membres de données statiques sont stockés à un seul endroit et partagés par tous les objets. La valeur d'un membre de données statique est la même pour chaque objet, mais sa valeur peut être mise à jour. Tant que la valeur du membre de données statique est mise à jour une fois, tous les objets ont la garantie d'accéder à la même valeur mise à jour, ce qui améliore l'efficacité temporelle.
L'utilisation et les précautions relatives aux membres de données statiques sont les suivantes :
1. Lors de la définition ou de la déclaration d'un membre de données statique, ajoutez le mot-clé static devant.
2. L'initialisation des membres statiques est différente de l'initialisation des membres de données ordinaires. Le format d'initialisation des membres de données statiques est le suivant :
<data type><class name>::<static data member name>=<value>
Cela indique :
- (1) L'initialisation est effectuée en dehors du corps de la classe, et static n'est pas ajouté devant, afin d'éviter toute confusion avec des variables ou des objets statiques ordinaires.
- (2) Lors de l'initialisation, n'ajoutez pas les spécificateurs de contrôle d'accès du membre tels que private, public, etc.
- (3) Lors de l'initialisation, utilisez l'opérateur de résolution de portée pour indiquer la classe à laquelle il appartient. Par conséquent, les membres de données statiques sont des membres de la classe, et non des membres d'un objet.
3. Les membres de données statiques sont stockés de manière statique ; ils ont une durée de vie statique et doivent être initialisés.
4. Lorsque vous référencez un membre de données statique, utilisez le format suivant :
<class name>::<static member name>
Si l'autorisation d'accès du membre de données statique le permet (c'est-à-dire s'il s'agit d'un membre public), le membre de données statique peut être référencé dans le programme en utilisant le format ci-dessus.
L'exemple suivant illustre l'application des membres de données statiques :
Exemple
À partir de la sortie, on peut voir que la valeur de Sum est égale pour l’objet M et l’objet N. Cela s’explique par le fait que lors de l’initialisation de l’objet M, les valeurs des trois membres de données int de l’objet M sont additionnées et affectées à Sum, donc Sum stocke cette valeur. Lors de l’initialisation de l’objet N, les valeurs des trois membres de données int de l’objet N sont additionnées puis ajoutées à la valeur existante de Sum, donc Sum stockera la nouvelle valeur. Par conséquent, la valeur référencée via l’objet M ou l’objet N est la même, à savoir 54.
Fonction membre statique
Comme les membres de données statiques, les fonctions membres statiques font partie des membres statiques de la classe ; elles ne sont pas des membres d’objet. Par conséquent, référencer des membres statiques ne nécessite pas d’utiliser un nom d’objet.
Dans l’implémentation d’une fonction membre statique, les membres non statiques déclarés dans la classe ne peuvent pas être référencés directement, mais les membres statiques déclarés dans la classe peuvent l’être. Si une fonction membre statique doit référencer des membres non statiques, elle peut le faire par l’intermédiaire d’un objet. L’exemple suivant illustre cela.
Exemple
Les lecteurs peuvent analyser le résultat par eux-mêmes. On peut voir que l'appel d'une fonction membre statique utilise le format suivant :
<class name>::<static member function name>(<parameter list>);
Méthodes d'initialisation pour différents types de variables membres en C++
Les différents types de membres en C++ ont différentes méthodes d'initialisation selon qu'ils sont statiques ou const. La syntaxe de Java n'est pas aussi compliquée ; pas étonnant que tant de personnes se mettent toutes à apprendre Java. Dans le passé, on m'a posé cette question en entretien et je n'ai pas pu y répondre. Quand j'écrivais du code, je me trompais souvent. Ici, j'ai consulté un livre et je l'ai résumé.
Certaines variables membres ont des types de données spéciaux, et leurs méthodes d'initialisation diffèrent également de celles des variables membres de types de données ordinaires. Ces types spéciaux de variables membres incluent :
- a. Variables membres constantes
- b. Variables membres de référence
- c. Variables membres statiques
- d. Variables membres statiques constantes de type intégral
- e. Variables membres statiques constantes de type non intégral
Pour les variables membres constantes et les variables membres de référence, l'initialisation doit être effectuée via la liste d'initialisation du constructeur. L'affectation de valeurs aux variables membres constantes et aux variables membres de référence dans le corps du constructeur n'est pas possible.
L'initialisation des variables membres statiques est également assez particulière.
Référez-vous au code suivant et à ses commentaires :
Résumé des membres statiques C++, C++, static
Ensuite, j'ai réfléchi profondément et j'ai décidé de résumer minutieusement les points clés concernant les membres statiques de classe, afin que lors de futurs entretiens je ne sois pas passif sur de telles questions.Les membres statiques de classe comprennent deux parties : les membres de données statiques et les membres de fonction statiques.
Membres de données statiques
Membre de données statique
1. Définition des membres de données statiques.
Les membres de données statiques sont en fait des variables globales dans la portée de la classe. Par conséquent, la définition (initialisation) des membres de données statiques ne doit pas être placée dans les fichiers d'en-tête. (Déclaration vs définition (initialisation)) Leur méthode de définition est la même que celle des variables globales. Exemple :
Fichier
N'essayez pas de définir (initialiser) les membres de données statiques dans les fichiers d'en-tête. Dans la plupart des cas, cela provoquera des erreurs telles qu'une redéfinition. Même si vous ajoutezou#ifndef #define #endifcela ne fonctionnera toujours pas.#pragma once2. Les membres de données statiques sont partagés par tous les objets de la classe, y compris les objets des classes dérivées de cette classe. Autrement dit, les objets de classe dérivée et les objets de classe de base partagent les membres de données statiques de la classe de base. Exemple :
// Déclaration
// Correct, _staticVar est un membre de données statique
// Correct, membre de données statique
La valeur d'un membre de données statique peut être légalement modifiée dans une fonction membre const. Exemple :
// fonction membre const
Fonction membre statique
1. L'adresse d'une fonction membre statique peut être stockée dans un pointeur de fonction ordinaire, tandis que l'adresse d'une fonction membre ordinaire doit être stockée dans un pointeur de fonction membre de classe. Exemple :
// Pointeur de fonction ordinaire
3. Les fonctions membres statiques ne peuvent pas être déclarées en même temps comme des fonctions virtual, const ou volatile. Exemple :
// Erreur
Auteur : SDMrFeng
Original : https://blog.csdn.net/tobefxz/article/details/14109697
Pycharm Importer des packages, modules Python