Constructeur par défaut
Fait partie de la section Programmation Orientée Objet du Journey C++ de Coddy. Leçon 18 sur 104.
Un constructeur par défaut est un constructeur qui peut être appelé sans aucun argument. Il initialise un objet lorsqu'aucune valeur initiale n'est fournie. Chaque classe a besoin d'un moyen de créer des objets dans un état par défaut valide.
Si vous ne définissez aucun constructeur, le compilateur génère un constructeur par défaut implicite qui ne fait rien pour les types primitifs et appelle les constructeurs par défaut pour les objets membres.
class Player {
int health;
int score;
public:
Player() { // Constructeur par défaut
health = 100;
score = 0;
}
};
Player p1; // Appelle le constructeur par défaut
Player p2{}; // Appelle également le constructeur par défautUne fois que vous définissez un constructeur (comme un constructeur paramétré), le compilateur ne génère plus de constructeur par défaut. Vous devez en définir un explicitement si vous en avez toujours besoin.
class Enemy {
int damage;
public:
Enemy(int d) : damage(d) {} // Constructeur paramétré uniquement
};
Enemy e1(10); // Fonctionne
Enemy e2; // Erreur ! Pas de constructeur par défautEn C++ moderne, vous pouvez demander explicitement le constructeur par défaut généré par le compilateur en utilisant = default :
class Item {
int id;
public:
Item() = default; // Le compilateur génère le constructeur par défaut
Item(int i) : id(i) {}
};Les constructeurs par défaut sont essentiels pour créer des tableaux d'objets et pour les classes utilisées dans des conteneurs comme std::vector, qui peuvent avoir besoin de construire des éléments sans arguments.
Défi
FacileConstruisons un système de compteur simple qui montre comment les constructeurs par défaut initialisent les objets dans un état de départ valide.
Vous allez créer deux fichiers pour organiser votre code :
Counter.h: définissez une classeCounterqui suit une valeur de compteur. Votre classe doit comporter :- un attribut
countprivé (entier) - un attribut
nameprivé (chaîne de caractères) pour identifier le compteur - un constructeur par défaut qui initialise
countà0etnameà"Unnamed", puis affiche"Counter created: <name>" - une méthode
increment()qui augmente le compteur de 1 - une méthode
getCount()qui renvoie la valeur actuelle du compteur - une méthode
getName()qui renvoie le nom du compteur
- un attribut
main.cpp: montrez que les constructeurs par défaut fonctionnent lors de la création d'objets de différentes façons. Lisez un nombre saisi indiquant combien de fois incrémenter le compteur, puis :- créez un Counter à l'aide de l'initialisation directe :
Counter c1; - créez un autre Counter à l'aide de l'initialisation par accolades :
Counter c2{}; - incrémentez
c1le nombre de fois indiqué par la saisie - affichez
"<name>: <count>"pour c1 - affichez
"<name>: <count>"pour c2
- créez un Counter à l'aide de l'initialisation directe :
Les deux compteurs doivent commencer à 0 grâce à votre constructeur par défaut, mais seul c1 sera incrémenté. Cela montre comment les constructeurs par défaut garantissent que chaque objet commence dans un état prévisible et valide, quelle que soit la façon dont il est créé.
Incluez votre fichier d'en-tête dans main.cpp à l'aide de #include "Counter.h".
Essayez vous-même
#include <iostream>
#include "Counter.h"
using namespace std;
int main() {
// Lire le nombre de fois à incrémenter
int n;
cin >> n;
// TODO: Créer un Counter en utilisant l'initialisation directe : Counter c1;
// TODO: Créer un autre Counter en utilisant l'initialisation par accolades : Counter c2{};
// TODO: Incrémenter c1 le nombre de fois spécifié par n
// TODO: Afficher "<name>: <count>" pour c1
// TODO: Afficher "<name>: <count>" pour c2
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesGénération et compilation en C++Fichiers d’en-tête et fichiers sourceEspaces de noms et portéeIntroduction à la POO en C++Classes et objetsLe pointeur « this »Méthodes (fonctions membres)Attributs (membres de données)Bases des constructeurs et destructeursRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d’instance et statiquesAccesseurs et mutateursFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d’accès de l’héritageOrdre d’appel des constructeurs et destructeursRedéfinition des méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif : hiérarchie des employés10Vue d’ensemble de la STL
Vue d’ensemble et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - fréquence des mots13Modèles de conception, partie 1
Introduction aux modèles de conceptionModèle SingletonFabrique et fabrique abstraiteModèle BuilderModèle ObserverModèle Strategy2Gestion de la mémoire
Mémoire de pile ou de tasPointeurs et référencesMémoire dynamique (new/delete)Pointeurs intelligents en C++RAII en C++Récapitulatif - Gestionnaire de tableaux dynamiques5Encapsulation
Spécificateurs d’accès en C++Spécificateurs d’accès en profondeurMasquage de l’informationStruct vs classeClasses imbriquées et internesRécapitulatif - Système de gestion des dossiers étudiants8Polymorphisme
Polymorphisme à la compilation vs à l’exécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d’interfaces en C++Conversion dynamique et RTTIRécapitulatif - Calculateur de formes3Constructeurs et destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d’initialisation des constructeursConstructeurs déléguésApprofondissement des destructeursRègle des trois / cinq / zéroRécapitulatif - Classe String6Surcharge des opérateurs
Introduction à la surcharge des opérateursSurcharge des opérateurs arithmétiquesSurcharge des opérateurs de comparaisonOpérateurs de fluxSurcharge de l’opérateur d’affectationSurcharge des opérateurs [] et ()Opérateurs de conversion de typeRécapitulatif – Classe Matrix9Templates
Templates de fonctionsTemplates de classesSpécialisation des templatesTemplates variadiquesBases de SFINAE et des traits de typesRécapitulatif - Conteneur génériqueEntraînez-vous par vous-même : Compilateur C++ en ligne