C++ Constructeur de classe & Destructeur

Classes et objets C++

Constructeur de classe

ClasseConstructeurUn constructeur est une fonction membre spéciale d'une classe, automatiquement exécutée chaque fois qu'un nouvel objet de la classe est créé.

Le nom du constructeur est exactement le même que le nom de la classe, et il n'a pas de type de retour (pas mêmevoidsignifie que b est un tableau d'objets de la classe AB, contenant 3 objets ; par conséquent, le constructeur est appelé 3 fois ;

signifie que p est un tableau de pointeurs d'objets de la classe AB, contenant 4 pointeurs d'objets de classe ; aucun constructeur n'est appelé.

L'exemple suivant aide à mieux comprendre le concept de constructeurs :

Exemple

#include <iostream> using namespace std; class Line { public: Line(); // Déclaration du constructeur void setLength(double len); double getLength() const; private: double length; }; // Définition du constructeur Line::Line() { cout << "L'objet est en cours de création" << endl; length = 0.0; // Initialiser explicitement les variables membres } void Line::setLength(double len) { length = len; } double Line::getLength() const { return length; } // La fonction principale du programme int main() { Line line; // Définir la longueur line.setLength(6.0); cout << "Longueur de la ligne : " << line.getLength() << endl; return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Object is being created
Length of line : 6

Constructeurs paramétrés

Le constructeur par défaut n'a aucun paramètre, mais si nécessaire, les constructeurs peuvent aussi avoir des paramètres. De cette façon, des valeurs initiales sont attribuées à l'objet lors de sa création, sans qu'il soit nécessaire d'effectuer un appel séparésetfonctions, comme le montre l'exemple suivant :

Exemple

#include <iostream> using namespace std; class Line { public: Line(double len); // Déclaration du constructeur avec paramètres void setLength(double len); double getLength() const; private: double length; }; // Définition du constructeur Line::Line(double len) { cout << "Objet en cours de création, longueur = " << len << endl; length = len; } void Line::setLength(double len) { length = len; } double Line::getLength() const { return length; } // La fonction principale du programme int main() { Line line(10.0); // Passer la longueur initiale directement lors de la création d'un objet // Obtenir la longueur initiale cout << "Longueur de la ligne : " << line.getLength() << endl; // Réinitialiser la longueur line.setLength(6.0); cout << "Longueur de la ligne : " << line.getLength() << endl; return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Object is being created, length = 10
Length of line : 10
Length of line : 6

Utilisation de listes d'initialisation pour initialiser des champs

C++ recommande d'utiliserla liste d'initialisation des membrespour initialiser les variables membres. Sa syntaxe consiste à ajouter un deux-points après la liste des paramètres du constructeur,:), puis écrivezmember variable name (initial value)。

Dans l'exemple suivant,: length(len)signifie : utiliser le paramètre passélenpour initialiser directement les variables membreslength. RemarquecoutCe qui est affiché est la variable membrelength, plutôt qu'un paramètrelence qui vous permet de vérifier intuitivement que les variables membres ont été correctement affectées :

Ligne::Ligne(double len) : length(len) { // À ce stade, length a été affecté via la liste d'initialisation ; affichez length pour vérifier le résultat cout << "Objet en cours de création, length = " << length << endl; }

La syntaxe ci-dessus est équivalente à l'affectation suivante dans le corps de la fonction ; les deux produisent exactement le même résultat :

Ligne::Ligne(double len) { length = len; // Affecter le paramètre len à la variable membre length cout << "Objet en cours de création, length = " << length << endl; }

La différence entre les deux approches est que la liste d'initialisation effectue l'initialisation des variables membres avant d'entrer dans le corps de la fonction,avanttandis que l'affectation à l'intérieur du corps de la fonction construit d'abord par défaut puis affecte, ce qui constitue une étape supplémentaire. Pourconstles membres const, les membres référence et les membres objet sans constructeur par défaut, la liste d'initialisation estl'uniqueméthode d'initialisation.

Supposons qu'il existe une classe C avec plusieurs champs X, Y, Z, etc. qui doivent être initialisés ; séparez simplement les différents champs par des virgules, comme indiqué ci-dessous :

C::C(double a, double b, double c) : X(a), Y(b), Z(c) { // Autre logique d'initialisation (le cas échéant) }

Remarque :L'ordre d'initialisation des membres dans la liste d'initialisation est déterminé par leur ordre dans la classe,l'ordre de déclarationet non par l'ordre dans lequel ils sont écrits. Il est recommandé de les garder cohérents pour éviter toute confusion.

Destructeur de classe

ClassedestructeurUn destructeur est une fonction membre spéciale d'une classe. À la fin de la durée de vie d'un objet (lorsqu'il sort de la portée ou estdeletesupprimé), il est automatiquement exécuté pour libérer les ressources occupées par l'objet (telles que la mémoire dynamique, les descripteurs de fichiers, etc.).

Le nom du destructeur est exactement le même que le nom de la classe, sauf qu'un tilde (~) est ajouté devant lui~comme préfixe. Il ne renvoie aucune valeur, ne peut avoir aucun paramètre, et chaque classe ne peut avoir qu'un seul destructeur.

L'exemple suivant aide à mieux comprendre le concept de destructeurs :

Exemple

#include <iostream> using namespace std; class Line { public: Ligne(); // Déclaration du constructeur ~Ligne(); // Déclaration du destructeur void setLength(double len); double getLength() const; private: double length; }; // Définition du constructeur Line::Line() { cout << "L'objet est en cours de création" << endl; length = 0.0; } // Définition du destructeur Line::~Line() { cout << "L'objet est en cours de suppression" << endl; // S'il y a des ressources allouées dynamiquement, libérez-les ici, par ex., delete[] data; } void Line::setLength(double len) { length = len; } double Line::getLength() const { return length; } // La fonction principale du programme int main() { Line line; // Lorsque le programme se termine, le destructeur est appelé automatiquement // Définir la longueur line.setLength(6.0); cout << "Longueur de la ligne : " << line.getLength() << endl; return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Object is being created
Length of line : 6
Object is being deleted

Classes et objets C++

autres extensions