Formation programmation C++

Programmer objet en C++, tutoriel & guide de travaux pratiques en pdf.

1. LA FORME CANONIQUE DE COPLIEN
1.1 CONSTRUCTEUR PAR DÉFAUT
1.2 CONSTRUCTEUR DE RECOPIE
1.2.1 BUT DU CONSTRUCTEUR DE RECOPIES
1.2.2 PROTOTYPE DU CONSTRUCTEUR DE RECOPIE
1.2.3 QUAND EST IL NÉCESSAIRE DE CRÉER UN CONSTRUCTEUR DE RECOPIE?
1.3 LE DESTRUCTEUR
1.4 OPÉRATEUR D’AFFECTATION
1.4.1 PROTOTYPE DE L’OPÉRATEUR D’AFFECTATION
1.4.2 DIFFICULTÉ SUPPLÉMENTAIRE PAR RAPPORT AU CONSTRUCTEUR PAR RECOPIE
1.5 EXERCICE RÉSOLU: UNE CLASSE CHAÎNE DE CARACTÈRES
1.5.1 STRUCTURE:
1.5.2 MISE EN ŒUVRE
1.5.3 CODE RÉSULTANT
1.6 EXERCICE RÉSOLU: DIFFÉRENCE ENTRE CONSTRUCTION ET AFFECTATION
1.7 LES CONSTRUCTEURS NE SUPPORTENT PAS LE POLYMORPHISME!
2. DE LA SURCHARGE DES OPÉRATEURS ET DE LA BONNE UTILISATION DE RÉFÉRENCES EN GÉNÉRAL
2.1 BUTS
2.2 CHOISIR ENTRE MÉTHODE ET FONCTION
2.2.1 UN EXEMPLE PARTICULIER: LES OPÉRATEURS DE REDIRECTION
2.2.2 UNE RÈGLE BIEN UTILE
2.2.3 RÉCAPITULATIF
2.3 QUELS OPÉRATEURS NE PAS SURCHARGER?
2.4 QUELS PARAMÈTRES DOIVENT PRENDRE LES OPÉRATEURS
2.4.1 PRÉFÉRER LES RÉFÉRENCES CONSTANTES AUX OBJETS
2.4.2 POURQUOI NE PAS TOUJOURS RENVOYER UNE RÉFÉRENCE
2.5 QUE DOIVENT RENVOYER LES OPÉRATEURS?
2.6 LE CAS PARTICULIER DES OPÉRATEURS D’INCRÉMENTATION
2.7 LE CAS PARTICULIER DES OPÉRATEURS NEW ET DELETE
2.7.1 BIEN COMPRENDRE LE FONCTIONNEMENT DE NEW ET DELETE
2.7.2 UNE VERSION SPÉCIALE DE NEW: OPERATOR NEW DE PLACEMENT
2.7.3 EXERCICE: UN EXEMPLE SIMPLISTE DE SURCHARGE DE NEW ET DELETE
3. LA GESTION DES EXCEPTIONS
3.1 SCHÉMA GÉNÉRAL D’INTERCEPTION DES EXCEPTIONS
3.2 LA LOGIQUE DE TRAITEMENT DES EXCEPTIONS
3.3 RELANCER UNE EXCEPTION
3.4 UTILISER SES PROPRES EXCEPTIONS
3.4.1 DÉCLARER SES EXCEPTIONS
3.4.2 UTILISER SES EXCEPTIONS
3.5 LES SPÉCIFICATEURS D’EXCEPTION
4. LES TRANS TYPAGES EN C++
4.1 NOUVELLE SYNTAXE DE L’OPÉRATEUR TRADITIONNEL
4.2 NOUVEAUX OPÉRATEURS DE TRANS TYPAGE
4.2.1 POURQUOI?
4.2.2 SYNTAXE
4.2.3 FONCTIONNALITÉS
4.3 LES CONVERSIONS IMPLICITES
4.3.1 LES OPÉRATEURS DE CONVERSION IMPLICITES
4.3.2 LES CONSTRUCTEURS AVEC UN SEUL PARAMÈTRE
5. EN GUISE DE CONCLUSION

La forme canonique de Coplien

La forme canonique, dite de Coplien, fournit un cadre de base à respecter pour les classes non triviales dont certains attributs sont alloués dynamiquement. Une classe Test dite sous forme canonique (ou forme normale ou forme standard) si elle présente les méthodes suivantes :

class T
{
public:
T (); // Constructeur par défaut
T (constT&); // Constructeur de recopie
~T (); // Destructeur éventuellement virtuel
T &operator=(const T&); // Operator d’affectation
};

Programme 1.1 Forme canonique de Coplien
Etudions chacune des composantes de la forme canonique :

Constructeur par défaut

Le constructeur par défaut est un constructeur sans argument ou dont chacun des arguments possède une valeur par défaut.
Il est utilisé, par exemple, lorsque l’on crée des tableaux d’objet. En effet, il n’est pas possible de passer un constructeur à l’opérateur new responsable de la création des tableaux.
En outre, de nombreuses bibliothèques commerciales ou non (Third Party Software), dont la bibliothèque standard du C++, nécessitent un constructeur par défaut pour la fabrication d’objets temporaires.
Si vous ne spécifiez aucun constructeur pour votre classe, alors le compilateur essaye de fournir un constructeur par défaut, qui, selon les environnements de développement, initialise à zéro chacun des membres de la classe ou les laisse vide. Au cas où votre classe agrégerait par valeur des objets, ceux-ci sont initialisés par leur constructeur par défaut s’il existe – autrement, le constructeur par défaut automatique ne peut pas être construit faute de moyen de construction des objets agrégés.

Constructeur de recopie

But du constructeur de recopies
Comme son nom l’indique, le constructeur de recopie est spécialisé dans la création d’un objet à partir d’un autre objet pris comme modèle. J’insiste sur le fait qu’il s’agit d’une création, donc à l’intérieur d’une déclaration d’objet. Toute autre duplication (au cours de la vie d’un objet) sera faite par l’opérateur d’affectation.Le constructeur de recopie a également deux autres utilisations spécifiées dans le langage :
Lorsqu’un objet est passé en paramètre par valeur à une fonction ou une méthode, il y a appel du constructeur par recopie pour générer l’objet utilisé en interne dans celle-ci. Ceci garantit que l’objet original ne peut être modifié ! L’autre solution consiste à utiliser une référence constante.
Au retour d’une fonction / méthode renvoyant un objet, il y a création d’un objet temporaire par le constructeur de recopie, lequel est placé sur la pile pour usage par le code appelant.

Prototype du constructeur de recopie
La forme habituelle d’un constructeur de recopie est la suivante :
T::T(constT&)
Le paramètre est passé en référence, ce qui assure de bonnes performances et empêche un bouclage infini. En effet, si l’argument était passé par valeur, il devrait être construit par le constructeur de recopie. Hors c’est précisément ce dernier que nous bâtissons : il y aurait un appel récursif infini !

Quand est il nécessaire de créer un constructeur de recopie ?
Si nous ne spécifiez pas de constructeur par recopie, le compilateur en crée un automatiquement. Celui-ci est très simple : il recopie bit à bit, de manière « optimisée » l’objet source dans l’objet destination.
Ce comportement est absolument parfait pour les classes simples ne réalisant ni agrégation ni allocations dynamiques. Dans ce cas là, vous n’avez pas besoin de fournir un constructeur de recopie car vous ferez probablement moins bien que le compilateur lui même.
Dans tous les autres cas, vous aurez besoin de définir un constructeur de recopie :
Agrégation par valeur :il vous faudra recopier les objets agrégés par valeur, en appelant … leur constructeur par recopie !
Agrégation par référence (ou pointeur) et allocation dynamique de mémoire :la copie optimisée ne générant que des copies de pointeurs, différents objets utiliseraient les même cases mémoire. D’une part, les modifications de l’un seraient répercutées sur l’autre, mais, plus grave, en l’absence de mécanismes de garde fou, les mêmes blocs de mémoire seraient libérés plusieurs fois par les destructeurs : il est nécessaire de faire une recopie des objets agrégés par référence (avec le constructeur de recopie …) ou des blocs de mémoire (new…)

Le destructeur
Le destructeur est là pour rendre les ressources occupées par un objet lorsqu’il arrive en fin de vie, soit qu’il soit alloué statiquement et sorte de portée, soit qu’il ait été alloué dynamiquement à l’aide de new et qu’on lui applique delete pour le supprimer.
Si un objet agrège statiquement d’autres objets, ceux-ci sont automatiquement détruits : il n’y a pas lieu de s’en soucier.
En revanche, s’il agrège dynamiquement d’autres objets (en particulier par l’intermédiaire de pointeurs), il sera indispensable de les détruire (par un appel à delete) sous peine de ne pouvoir disposer à nouveau de la mémoire avant le prochain reboot !

……

Si le lien ne fonctionne pas correctement, veuillez nous contacter (mentionner le lien dans votre message)
Cours: C ++ pour les pros (237 KO) (Cours PDF)
Cours du C

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *