-
Le constructeur et le destructeur sont deux méthodes particulières qui sont appelées respectivement à la création et à la destruction d'un objet
-
Le compilateur définit un constructeur et un destructeur par défaut
-
A partir du moment ou un constructeur ou un destructeur a été défini par le programmeur, le compilateur ne définit plus le constructeur ou destructeur par défaut.
-
Le constructeur et le destructeur doivent
- Porter le même nom que la classe
- Ne pas avoir de type de retour
-
Le destructeur est en plus précédé du signe ~
Personne(){
nom="";
age=0;
}
Personne(string n, int a){
nom=n;
age=a;
}
Personne(string n){
nom=n;
}
~Personne(){}- Pour initialiser les données membres, on peut utiliser une liste d’initialisation.
Personne(string n, int a):nom(n), age(a){}- Si la déclaration est séparée de la définition, on ne met la liste d’initialisation que dans le .cpp
fichier .h Personne(string n, int a);
fichier .cpp Personne::Personne(string n, int a):nom(n),age(a){}- Un constructeur s’appelle comme les autres fonctions
Personne p("toto",20); // crée une personne avec nom égal à toto et age égal à 20- Pour le constructeur par défaut, on peut ne pas mettre les parenthèses
Personne p();
Personne p; // ces 2 lignes sont équivalentes- Le constructeur de copie est un constructeur qui prend en paramètre une référence sur un objet de la classe.
Personne(Personne & p);- Sert à créer un nouvel objet de la classe en copiant un autre objet
Personne p1("toto", 20);
Personne p2(p1); //p2 sera une nouvelle personne avec les mêmes valeurs d’attributs que p1.class Personne{
private :
string nom;
int nbLivres;
string *livres;
public:
Personne(string n, int nb): nom(n),nbLivres(nb) {
livres = new string[nbLivres];}
Personne(Personne &source){
nom = source.nom;
nbLivres = source.nbLivres;
livres = new string[nbLivres];
for(int i = 0; i<nbLivres;i++){
livres[i] = source.livres[i]}
}
};-
Le constructeur de copie est appelé implicitement lorsque l’on passe un objet en paramètre en entrée
-
Un constructeur de copie par défaut existe, mais il n’est pas suffisant lorsqu’il y a de l’allocation dynamique de mémoire (utilisation de new) car sinon il y a partage de la zone mémoire allouée