Flux rss
Collection CommentÇaMarche.net
Bookmark Ajouter aux favoris / Partager

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 !

Dernière modification le mardi 14 octobre 2008 à 17:40:30.Ce document intitulé « Les constructeurs et les destructeurs en langage C++ » issu de 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.

Langage C++ - Les types de données Les types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître... www.commentcamarche.net/contents/cpp/cpptype.php3
Langage C - Les types de données Les types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le... www.commentcamarche.net/contents/c/ctype.php3
Introduction au langage C Petite histoire du C Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie... www.commentcamarche.net/contents/c/cintro.php3
Les files en langage CLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un... www.commentcamarche.net/faq/sujet-8282-les-files-en-langage-c
Les piles en langage CLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage... www.commentcamarche.net/faq/sujet-8283-les-piles-en-langage-c
[Langage C] C/C++ Erreur de segmentationQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux... www.commentcamarche.net/faq/sujet-4791-langage-c-c-c-erreur-de-segmentation
Exec en langage C (Résolu)Bonjour à tous. J'écris un programme en langage C permettant de créer un fichier de config (pour MRTG). Pour cela je dois utiliser la primitive "exec", la commande que je souhaite lancer ressemble à : snmpgetnext -c community IPadress OID. Comment "... www.commentcamarche.net/forum/affich-1623603-exec-en-langage-c
Couleur des texte en langage c (Résolu)Bonjours à tous, Je programme déjà depuis un petit temps en langage c. Seulement j'ai un petit problème, j'aimerais savoir quelle est l'instruction pour changer la couleur d'un texte mais je ne trouve pas de tutoriel. Si quelqu'un pouvait m'aider sa... www.commentcamarche.net/forum/affich-2622033-couleur-des-texte-en-langage-c
Langage C pointeurs, creation de liste. (Résolu)Bonjour a tous. Voila, je rencontre quelaues petits preoblemes en langage C. Le but est de creer des fiches afin de creer une listes les contenant. Il faut ensuite afficher ce que l on a entre dans chaque fiche, puis afficher enfin le nombre de fiches... www.commentcamarche.net/forum/affich-2170245-langage-c-pointeurs-creation-de-liste
Langage C++ - Les pointeursComme en langage C, le langage C++ permet d'utiliser des pointeurs pour manipuler des données, mais il introduit aussi le concept de référence, très pratique pour permettre la modification d'une donnée passée en paramètre d'une fonction. Définition... www.commentcamarche.net/contents/cpp/cpppoint.php3
Langage C - Les chaînes de caractèresQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne... www.commentcamarche.net/contents/c/cstring.php3
Langage C - Les variablesLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans... www.commentcamarche.net/contents/c/cvar.php3