Comment Ca Marche - Communauté informatique  
   
Accueil - Encyclopédie informatiqueTélécharger l'encyclopédieContribuer à cet article

Langage C++ - Constructeurs et destructeurs

Constructeurs et destructeurs Encyclopédie


La notion de constructeur

Le constructeur est la fonction membre appelée automatiquement lors de la création d'un objet (en statique ou en dynamique). Cette fonction membre est la première fonction membre à être exécutée, il s'agit donc d'une fonction permettant l'initialisation des variables.
Le constructeur d'un objet porte le même nom que la classe et ne possède aucune valeur de retour (même pas void).

  • un constructeur porte le même nom que la classe dans laquelle il est défini
  • un constructeur n'a pas de type de retour (même pas void)
  • un constructeur peut avoir des arguments
  • la définition d'un constructeur n'est pas obligatoire lorsqu'il n'est pas nécessaire

La définition de cette fonction membre spéciale n'est pas obligatoire (si vous ne souhaitez pas initialiser les données membres par exemple) dans la mesure où un constructeur par défaut (appelé parfois constructeur sans argument) est défini par le compilateur C++ si la classe n'en possède pas.

Voyons sur un exemple comment se déclare un constructeur :

class Toto{
	private :
		int age;

		char sexe;

		float taille;

	public :
		Toto(int,char,float);

};

Toto::Toto(int age, char sexe, float taille){
	this->age = age;

	this->sexe = sexe;

	this->taille = taille;

}

L'appel du constructeur se fait lors de la création de l'objet. De ce fait, l'appel du constructeur est différent selon que l'objet est créé de façon statique ou dynamique :

  • en statique : le constructeur est appelé grâce à une instruction constituée du nom de la classe, suivie par le nom que l'on donne à l'objet, et les paramètres entre parenthèses.
    Toto Toto1(12,'M',1.62);
  • en dynamique : le constructeur est appelé en définissant un pointeur vers un objet du type désiré puis en lui affectant la valeur retournée par l'opérateur new.
    Toto *pToto = new Toto(12,'M',1.62);

Comme pour n'importe quelle fonction membre, il est possible de surcharger les constructeurs, c'est-à-dire définir plusieurs constructeurs avec un nombre/type d'arguments différents. Ainsi, il sera possible d'initialiser différemment un même objet, selon la méthode de construction utilisée.

Imaginons par exemple que pour l'exemple précédent on veuille pouvoir définir le sexe de Toto grâce à un entier valant 0 ou 1, ainsi qu'avoir la possibilité de passer en paramètre la lettre 'M' ou 'F', on peut alors définir deux constructeurs pour lesquels le type du second argument sera différent. De plus, on va montrer de quelle manière il est possible de contrôler le caractère entré en paramètre :

class Toto{
	private :
		int age;

		char sexe;

		float taille;

	public :
		Toto(int,char,float);

		Toto(int,int,float);

};

Toto::Toto(int age, char sexe, float taille){
	this->age = age;

	if ((sexe=='M')||(sexe=='F')) {
	this->sexe = sexe;

	}
	else printf("Erreur d'initialisation");

	this->taille = taille;

}

Toto::Toto(int age, int sexe, float taille){
	this->age = age;

	switch (sexe) {
		case 0 :
			this->sexe = 'F';

			break;

		case 1:	
			this->sexe = 'M';

			break;

		default :
			printf("Erreur d'initialisation");

			break;

	}
	this->taille = taille;

}

Enfin, il est possible d'utiliser des valeurs par défaut pour les arguments, afin d'éviter à avoir à entrer de façon répétitive un ou plusieurs paramètres portant généralement la même valeur.

Les destructeurs

Les destructeurs sont en quelque sorte au constructeur ce que la mort est à la vie, c'est-à-dire qu'il s'agit d'une fonction membre qui intervient automatiquement lors de la destruction d'un objet. Il permet ainsi d'une certaine façon d'exaucer ses dernières volontés...

Le destructeur est une fonction membre dont la définition ressemble étrangement à celle du constructeur, hormis le fait que le nom du destructeur est précédé d'un tilde (~), et qu'il ne possède aucun argument.

  • un destructeur porte le même nom que la classe dans laquelle il est défini et est précédé d'un tilde
  • un destructeur n'a pas de type de retour (même pas void)
  • un destructeur ne peut pas avoir d'argument
  • la définition d'un destructeur n'est pas obligatoire lorsque celui-ci n'est pas nécessaire

Les destructeurs ont en général beaucoup moins besoin d'être définis que les constructeurs, c'est donc le destructeur par défaut qui est appelé le cas échéant. Toutefois, lorsque les objets sont chaînés dynamiquement grâce à des pointeurs (lorsqu'une fonction membre d'un objet est un pointeur vers un objet de même type par exemple), ou dans d'autres cas particuliers la définition d'un destructeur permettant de « nettoyer » l'ensemble des objets peut être indispensable !

Le destructeur, comme dans le cas du constructeur, est appelé différemment selon que l'objet auquel il appartient a été créé de façon statique ou dynamique.

  • le destructeur d'un objet créé de façon statique est appelé de façon implicite dès que le programme quitte la portée dans lequel l'objet existe
  • le destructeur d'un objet créé de façon dynamique doit être appelé grâce au mot clé delete, qui permet de libérer la mémoire occupée par l'objet.

Bien évidemment un destructeur ne peut être surchargé, ni avoir de valeur par défaut pour ses arguments, puisqu'il n'en a tout simplement pas !

Trucs & astuces pertinents trouvés dans la base de connaissances

09/01 20h26 C/C++ Erreur de segmentation (Langage C)
30/11 22h37 Comment débuter, quel langage? (Langages)
15/11 02h50 Langage informatique=Langage de programmation (Mythes et légendes)
21/09 09h44 Critères de choix d'un langage/framework (Programmation)
21/01 03h06 Envoyer un mail avec pièce jointe (Langages)
22/11 23h49 Ecrire en alphabet arabe (Windows)
04/11 15h50 Rediriger en fonction de la langue du visiteur (PHP)
Langage C++ Plus d'astuces sur « Langage C++ »

Discussions pertinentes trouvées dans le forum

29/03 02h24 barre langues affichage [barre de langues] probleme d'affichage Windows 14/02 10h21->rafik46
15/09 20h11 suse langue Suse langue Linux/Unix 21/09 17h31->Yoan27
28/12 12h44 ajouter langue arabe clavier français ajouter une langue arabe au clavier français Windows 21/02 23h50->marouen26
03/06 12h59  [Forum] Langage SMS Suggestions 12/06 02h18->Clarckos16
20/11 14h20 choix langage base donnée projet Choix d'un langage+base de donnée pour projet Développement 21/11 21h12->sebsauvage14
30/03 09h35 langage pointeurs liste. Langage C pointeurs, creation de liste. Développement 08/04 00h34->mamiemando12
03/09 02h58 langage remplacer for if [langage C] comment remplacer[for] par [if] Développement 05/09 23h07->mamiemando12
16/02 12h22 langage c jeu [Langage C] Jeu Développement 16/02 20h28->UNIX/VI/SHELL11
06/04 17h39 logiciel xsd xml gui quel langage [Logiciel XSD XML avec GUI]Quel langage Développement 08/04 13h42->sebsauvage9
28/06 15h02 quel language choisir quel language choisir ?? Développement 29/06 18h42->sebsauvage9
Discussion fermée Problème résolu Langage C++ Plus de discussions sur « Langage C++ »

Ce document intitulé « Langage C++ - Constructeurs et destructeurs » issu de l'encyclopédie informatique Comment Ça Marche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.