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 dé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 comptage. Votre classe doit avoir :- Un attribut privé
count(entier) - Un attribut privé
name(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 retourne le compte actuel - Une méthode
getName()qui retourne le nom du compteur
- Un attribut privé
main.cpp: Démontrez que les constructeurs par défaut fonctionnent lors de la création d'objets de différentes manières. Lisez un nombre à partir de l'entrée indiquant combien de fois incrémenter le compteur, puis :- Créez un Counter en utilisant l'initialisation directe :
Counter c1; - Créez un autre Counter en utilisant l'initialisation par accolades :
Counter c2{}; - Incrémentez
c1le nombre de fois spécifié par l'entrée - Affichez
"<name>: <count>"pour c1 - Affichez
"<name>: <count>"pour c2
- Créez un Counter en utilisant 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 manière dont il est créé.
Incluez votre fichier d'en-tête dans main.cpp en utilisant #include "Counter.h".
Aide-mémoire
Un constructeur par défaut est un constructeur qui peut être appelé sans aucun argument. Il initialise un objet lorsque aucune valeur initiale n'est fournie.
class Player {
int health;
int score;
public:
Player() { // Default constructor
health = 100;
score = 0;
}
};
Player p1; // Calls default constructor
Player p2{}; // Also calls default constructorSi vous ne définissez aucun constructeur, le compilateur génère un constructeur par défaut implicite. Cependant, dès que vous définissez un constructeur (comme un constructeur paramétré), le compilateur ne génère plus automatiquement de constructeur par défaut.
class Enemy {
int damage;
public:
Enemy(int d) : damage(d) {} // Parameterized constructor only
};
Enemy e1(10); // Works
Enemy e2; // Error! No default constructorVous pouvez explicitement demander le constructeur par défaut généré par le compilateur en utilisant = default :
class Item {
int id;
public:
Item() = default; // Compiler generates default constructor
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.
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 externesBuild et Compilation C++Fichiers d'en-tête et Fichiers sourceEspaces de noms et PortéeIntroduction à la POO en C++Classes vs ObjetsLe pointeur 'this'Méthodes (Fonctions membres)Attributs (Membres de données)Bases des Ctors et DtorsRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d'instance vs membres statiquesGetters et SettersFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d'accès à l'héritageOrdre d'appel des Ctor et DtorRedéfinition de méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif - Hiérarchie des employés10Présentation de la STL
Présentation et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - Fréquence des mots13Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonFabrique & Fabrique abstraitePatron MonteurPatron ObservateurPatron Stratégie2Gestion de la mémoire
Mémoire Pile vs TasPointeurs et RéférencesMémoire dynamique (new/delete)Smart Pointers 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 d'informationStruct vs ClassClasses imbriquées et internesRécapitulatif - Système de gestion d'étudiants8Polymorphisme
Polymorphisme : Compilation vs ExécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d'interfaces en C++Dynamic Casting & RTTIRécapitulatif - Calculateur de formes11Concepts avancés de la POO
Composition vs HéritageMixins via CRTPIdiome PimplEffacement de typeEnum Classes & Typage fortGestion des exceptions en POOHiérarchies d'exceptions personnalisées14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeRAII en tant que patron3Constructeurs et Destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d'initialisation du constructeurConstructeurs déléguésAnalyse approfondie du destructeurRègle de trois / cinq / zéroRécapitulatif - Classe String6Surcharge d'opérateurs
Introduction à la surcharge d'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 de templatesTemplates variadiquesBases de SFINAE & Type TraitsRécapitulatif - Conteneur générique