Programmation C
Programmation C
du C au C++
Patrick Bonnin
Formation Continue
CONTINENTAL Rambouillet
Objectifs de la Formation
1. Introduction:
2. Du C au C++:
3. La Notion de Classe:
4. Héritage et Polymorphisme:
5. Gestion des Exceptions:
Introduction
1. Historique:
2. Eléments de Qualité Logicielle :
3. Rappels du Langage C:
Historique
• Système UNIX : 1969 : Ken Thompson, Dennis Ritchie,
En Langage d’Assemblage,
• Langage C : 1972 : Dennis Ritchie, Brian Kerninghan.
Inspiré du langage B (structure de contrôle),
• Unix est réécrit en Langage C en 1973 :
À 90 % : le C est « proche » de la machine!
• Concept de la Programmation Orienté Objet :
Simula (1962), Smaltalk (1979),
• C++ : 1982 : Bjarne Stroustrup :
Adjoindre au Langage C des fonctionnalités permettant
d’appliquer les Concepts de la Programmation Orientée
Objet => Conserve la puissance du Langage C !!!
• Java : 1995 : Sun Micro Systems :
Machine Virtuelle, « Classe obligatoire », pas de Pointeurs,
bibliothèque sous forme de classes.
• C# : 2000 : MicroSoft
Ressemble à Java, Pointeurs possible : « unsafe »
Eléments de Qualité Logicielle
Critères de QUALITE d’un LOGICIEL :
• Exactitude :
Résultats voulus, dans conditions normales d’utilisation,
• Robustesse :
Aptitude à bien réagir, lorsque l’on s’écarte des conditions
normales d’utilisation,
• Extensibilité :
Facilité d’Adaptation à l’évolution des Spécifications.
• Réutilisabilité :
Possibilité d’utiliser certaines parties (modules) dans
d’autres applications,
• Portabilité :
Utilisation d’un même logiciel dans différents
environnements
• Efficience :
Temps d’Exécution, Taille Mémoire
Programmation Structurée,
Programmation Orientée Objet
Et Qualité Logicielle
• Programmation Structurée :
Wirth : Programme = Algorithmes + Structures de Données,
Convient pour l’Exactitude et la Robustesse,
Pas pour Extensibilité, Réutilisabilité car remise en cause des
données
• Programmation Orientée Objet :
Objet = Données + Méthodes (fonctions à appliquer aux
données) ,
Objet : Instance d’une Classe (Variable : instance d’un Type)
Encapsulation : « Interfaces » : Méthodes pour Accéder aux
données
Héritage : nouvelle classe à partir d’une ancienne : ajout de
nouvelles données et méthodes,
Meilleures Extensibilité, Réutilisabilité, Maintenance d’un
Logiciel.
Rappel de Langage C
• Instruction « Simple »:
Se termine par « ; »,
• Bloc d’Instructions « Simples »:
Plusieurs instructions simples successives entre { … }
Vu comme une instruction simple, par une instruction de
structure,
• Instruction de Structures :
Tests : if, else, Aiguillage : switch
Boucles : do, while, for
Pas de « ; » terminal, et agit sur une instruction simple.
• Types de Variables :
De base : char, int, float,
Qualificatifs : unsigned, short, long, double,
• Opérations :
= (affectation), +, -, *, /, %, ++, -- (Pré et Post)
Logique de Bits : &,|, <<, >>, ~, -
Rappel de Langage C (fin)
• Fonctions :
Approche « Fonctionnelle »,
Passage de Paramètres : par Valeur, par Adresse,
• Les Pointeurs :
Adresse de Variable, MAIS également de Fonction,
Utilisation : Passage de Paramètres, Allocation Dynamique
de Mémoire, les Tableaux, Programmation Système,
• Entrées / Sorties :
Standart : stdin, stdout, stderr,
Fichiers : Lecture / Ecriture – Formatées et Binaires.
• Chaînes de Caractères :
Terminaison par ‘\0’,
Gestion par la bibliothèque « string »,
• Structures de Données :
Accès aux champs par variable « . » ou par adresse « -> »
• Allocation Dynamique de Mémoire:
Du C au C++
• Squelette : proche du C:
• Nouvelles Librairies :
• Nouvelles Fonctions
d’Entrées / sortie :
cin, cout : + simples
• « Espaces Noms »
Bibliothèques à portée
limitée
Au lieu de sdt::cin
• Fonctions : idem C
Prototype (si possible
dans un fichier « .h »)
Appel,
Définition
(PPremierProg)
Les Prototypes en C++
• Prototypes Complets :
Nom des variables :
optionnel, non exploité
• Fonctions SANS Argument :
Ne pas mettre « void »
• Programmation « Avancée »
Dans un fichier « .h » avec
les structures de données
Ne pas oublier : (idem C)
#ifndef _Def
#define _Def
Structures.h
#include "Structures.h"
#include "Structures.h"
#endif #include "Fonction1.h"
#include "Fonction2.h"
Fonction1.h
#include "Structures.h"
Principal.c
Fonction2.h
Les Prototypes, Appels,
Définitions
• A l’Appel : Mise en
Correspondance des
Arguments du Prototype et
de l’Appel :
Correspondance Exacte,
Non Dégradante : c-i, i-f,
f-d
Dégradante : i-c, d-f, d-i,
f-i
• Si Prototypes et Définitions
dans un même fichier :
Vérification Possible :
Correspondance des
types de paramètres doit
être exacte !
(PTestPrototypes)
Les Entrées / Sorties Standard
• Qu’est ce ?
Arguments omis lors de la
transmission,
Leur valeur est fixée par
défaut.
• Mise en Oeuvre :
La valeur par défaut est fixée
dans le prototype,
Donc par l’utilisateur et NON
le concepteur.
Les arguments par défaut
sont les derniers !
Les arguments non par défaut
sont obligatoires !
(PArgumentDefaut)
Surcharge d’une Fonction
(Overload)
• Qu’est ce ?
Plusieurs fonctions peuvent
porter le même nom,
Idem pour les opérateurs.
Existence implicite en C pour +,
-, / , *, etc …
Le compilateur choisi la
fonction à mettre en oeuvre.
• Mise en Oeuvre :
Grâce à la Signature de la
fonction, ie le type des variables,
Recherche de correspondances
exactes, non dégradantes, puis
dégradantes !
Erreur de compilation si
ambiguïté
(PTestSurcharge)
Surcharge d’une Fonction
Ou Paramètres par Défaut ?
• Ne pas Utiliser de
Surcharge, lorsque l’on
peut utiliser les
paramètres par défaut :
La même fonction
avec un nombre
variable de
paramètres,
1 seule fonction à
écrire et compilée !
(PSurchargeouDefaut)
La Spécification « inline »
• Fonction « inline »:
Le Compilateur incorpore les
instructions en langage
machine de la fonction à
l’endroit de l’appel,
• Intérêts :
Rapidité : pas d’appel réel de
fonction, ie de branchement
(CALL en assembleur),
Vérification, comme pour une
fonction de la cohérence des
types (pas pour une macro
• Qualificatif « inline »: #define )
Prototype, • Inconvénient :
Définition. Exécutable plus volumineux,
• « implicite »: si fonction appelée plusieurs
Définition dans la classe. fois
(PTestFnctInline)
Les Espaces Nom
• Rappel :
Utilisation pour la
bibliothèque standard : std
• Intérêts :
Permet l’utilisation de
plusieurs bibliothèques
« incompatibles »,
Permet de spécifier la fonction
de la bonne bibliothèque
Utilisation : développements
« importants »
• Utilisation :
Déclaration,
Appel des fonctions,
Implicite avec les classes
(PTestEspaceNom)
Le type Bool
Le Qualificatif « const »
• Le type « bool » :
true : true->1, ≠ 0 -> true,
false : false 0
Meilleure lisibilité du code
• Qualificatif « const » pour une variable globale :
Portée limitée au fichier concerné,
Est utilisée dans une expression constante : exemple la
définition d’un tableau
Remplace par exemple : « #define NELT 10 »
La Notion de CLASSE
1. Structure C++:
2. L’Encapsulation:
3. La CLASSE:
4. Constructeur / Destructeur:
5. Durée de Vie / Visibilité des Objets:
6. Construction / Destruction d’Objets Complexes:
7. Membre de Données Statique:
8. Fonctions Membres et C++:
9. Retour d’un Objet d’une Fonction Membre:
10. Constructeur de Recopie et Opérateur d’Affectation:
11. Objets Membres:
12. Fonctions et Méthodes Amies:
13. Sur-Définition des Opérateurs:
14. Casts et Affectations en C++:
15. Patrons de Fonctions:
16. Patrons de Classes:
Les Structures C++
• Structures = Regroupement :
Données de type différent,
Fonctions membres ou
Méthodes (nouveauté C++),
Crée directement un nouveau
type de données, sans utiliser
« typedef ».
• Objet : Instance de la Structure :
Type => Structure C =>
Structure C++,
Variable => Variable
Structurée => Objet.
Allocation Statique ou
Dynamique
• Données (idem C):
Accès à partir d’une variable
structurée « . » ou d’un
pointeur « -> »
(PTestStructures)
Les Structures C++ (suite)
• Fonctions :
Prototype : dans la structure,
Définition : Utilisation de
l’Espace Nom, (MAIS ne pas
écrire « using namespace »)
Appel : opérateurs « . » et
« -> », à partir d’un objet ou
de l’adresse d’un objet.
Un objet « privilégié » : celui
qui appelle la fonction : pas en
paramètre.
• Recopie de Structures :
Possible : b = a;
• Cohabitation Fonctions « C » et
Méthodes:
(PTestStructures)
Les Structures C++ :
Code Complet (PTestStructure)
L’ENCAPSULATION
• Interdire l’Accès Direct aux Données d’un Objet de
l’Extérieur de la « Classe » :
• La CLASSE :
Extension de la Structure C++ permettant l’Encapsulation
• Accès aux Données :
Seulement par des Fonctions Membre : « les Interfaces » ,
donc de l’Intérieur de la Classe,
• Les Interfaces :
Fonctions membre permettant de lire / écrire les données
d’un objet,
Accessibles de l’Extérieur de la Classe.
• Evolution, Maintenance d’un Logiciel :
Classe (incluant Méthodes) : « bibliothèque logicielle »,
Les interfaces restent inchangées : pas de modification du
code des programmes des « Utilisateurs »,
Possibilité de modifier données et méthodes d’une classe
pour implanter des améliorations : nouvel algorithme plus
performant par ex …
La « CLASSE »
• La CLASSE : Généralisation de la Structure C++ :
Programmation Identique,
• Notion de « Statut »: « Gestion des Accès » :
Des Champs (ie. Données) et des Méthodes,
« individuel » pour chaque champ ou méthode
• 3 différents Statuts :
Private : par défaut, accessible uniquement de l’intérieur
de la classe,
permet l’Encapsulation,
Public : Accessible également par l’Extérieur de la Classe,
Comme la structure C++,
les interfaces doivent avoir ce statut.
Protected : statut intermédiaire : pour l’Héritage !
Private pour « l’Extérieur »,
Public pour les Classes Dérivées.
Exemple de Programmation avec
la notion de « Classe »
• Choix des Statuts :
Private,
Public
• Encapsulation :
Plus d’Accès aux Données
d’un Objet de l’Extérieur de
la Classe,
Réalisation d’Interfaces.
Validation des Statuts à la
Compilation :
Violation = Erreur de Compilation
Ré-écriture de la fonction non
membre la classe, avec
interfaces (sauf « AMIE »).
• Même écriture des Méthodes
• Même utilisation des Méthodes
(PTestClasse)
Les Classes:
Code Complet (PTestClasse)
Les Classes:
Code Complet (PTestClasse)
Constructeur et Destructeur
• Constructeur et Destructeur :
Méthodes particulières, pour toute classe,
Existence par défaut,
Constructeur : Crée l’Objet / Destructeur : Détruit l’Objet
Qualité Logicielle : « structure » la Création et la Libération
de la Mémoire
• Constructeur :
A la Création Statique ou Dynamique (appelé par new) d’un
Objet,
Utilité :
o Initialisation des champs de l’Objet,
o Objet « Complexe » (ie. Allocation dynamique en interne)
• Destructeur :
Appel à la destruction de l’Objet :
o Dynamique (appelé par delete)
o Statique : objet local d’une fonction ou méthode, objet
local d’une boucle,
o Constat DevC++ : MAIS pas pour objet local du main()
Exemple de Programmation des
Constructeur et Destructeurs
• Syntaxe de Programmation:
Constructeur :
o porte le nom de la classe,
o Peut avoir des paramètres,
Destructeur :
o porte le nom de la classe,
précédé de « ~ »,
o Sans paramètre.
• Dès présence d’un constructeur ou
destructeur :
Plus possibilité d’utiliser celui
par défaut, sans paramètre
pour le constructeur,
• Constructeur AVEC paramètres :
Permets l’Initialisation des
Champs,
Paramètres par défaut possible
(PTestConstructeurDestructeurSimple)
Durée de Vie des Objets
Alloués Statiquement et Dynamiquement
• Génie Logiciel:
Code Propre : les
allocations et
désallocations de
mémoire sont
« implicites » : pas
d’oublie possible !
(PTestObjetImage)
Membre de Données Statique
• Utilisation:
Comme un Membre
Ordinaire
(PTestMembreStatique)
Fonction Membres et
Nouveautés du C++
• Allocation Dynamique de
l’Objet, dans la Fonction :
Recopie des Objets :
Constructeur de Recopie
• La Recopie d’un Objet est effectuée lors :
De la transmission d’un Objet en argument à une Fonction,
Du Renvoi d’un Objet par Valeur comme résultat d’une
Fonction,
De l’Initialisation, lors de sa création d’un objet avec un
autre objet de même type.
• Constructeur de Recopie par Défaut :
Existe par défaut, comme le constructeur,
Recopie Membre à Membre tous les champs de l’Objet,
Effet « invisible »!
• Constructeur de Recopie :
Méthode Particulière,
Appelée par le Compilateur lors des Cas de Recopie,
Syntaxe particulière :
o Nom : celui de la Classe,
o Paramètre : Référence d’Objet Constant de Même Type.
Constructeur de Recopie :
Exemple : Objet Simple
• Recopie
Initialisation,
Transmission
Retour
(PTestConstructeurRecopie)
Recopie d’un Objets Complexe :
Nécessité du Constructeur de Recopie
• Constructeur de Recopie par Défaut : Problème Identifié
Recopie champ à champ l’objet,
Pas d’Allocation de Mémoire, Pas de Recopie de la Mémoire
Allouée,
Recopie uniquement de l’Adresse,
Même problème en Langage C
Recopie d’un Objets Complexe :
Nécessité du Constructeur de Recopie
• Constructeur de Recopie :
Utilisation ou Non,
• Accès aux Pixels :
getPixel : Lecture
putPixel : Ecriture
(PTestRecopieObjetImage)
Exemple :
Recopie de l’Objet Image
• Notion « d’Héritage » :
Implantation plus simple !
Problème de l’Encapsulation
• L’ENCAPSULATION :
Accès aux Données que par les Méthodes Membres de la
Classe,
Impossibilité pour une Fonction indépendante ou une
Méthode d’une autre classe d’Accéder aux Données d’une
Classe Donnée.
• Problème : Pour un projet de plus grande ampleur :
Plusieurs Classes Différentes en Considération,
Nécessité de la Possibilité pour une fonction indépendante
ou une méthode d’accéder aux données d’un objet d’une
autre classe !!!
• Exemple : Géométrie Vectorielle (idem Affine) :
Classes : Vecteur, Matrice,
Produit :
o Matrice – Matrice => Matrice
o Matrice – Vecteur => Vecteur
Fonctions et Méthodes Amies
• Notion : « d’Amitié » : Pour
Résoudre ce Problème
Permet à une Fonction
indépendante ou une Méthode
d’une autre classe d’Accéder
aux Données d’une autre
Classe.
• 4 Possibilités: déclaration dans les
Prototypes de la classe amie
Fonction Indépendante, Amie
d’une Classe,
Fonction Membre d’une
Classe, Amie d’une autre
Classe,
Fonction Amie de plusieurs
Classes,
L’Ensemble des Méthodes
d’une Classe, Amies d’une
Autre Classe (PTestFonctionsAmies)
Fonctions et Méthodes Amies
• Notion : « d’Amitié » :
Permet l’Accès Direct au
champs pour une fonction
non méthode de la classe !
Fonctions et Méthodes Amies
• Méthodes d’une Classe : Amies
d’une Autre Classe
Variante de l’Implantation
précédente pour la méthode :
CompareNom :
o Déclaration de l’Amitié à
l’ensemble de la classe
Sur Définition d’un Opérateur
• Deux Possibilités :
Fonction Membre :
dissymétrie des 2
opérandes,
Fonction amie :
symétrie
• Syntaxe :
Mot Clef :
« operator ».
• Ex d’Implantation:
« + » : Méthode,
« - » : Fonction
Amie.
• Utilisation :
« Intuitive »
(PTestSurDefOperateurNC)
Sur Définition : Implantation
• Retour sur le
Constructeur de
Recopie:
Si défini : la
recopie doit être
faite !
• 2 Implantations ≠:
Symétrique ou Non
Opérateurs de Cast et
d’Affectation « = »en C++
• Positionnement du Problème :
Cast : Changement de Type,
Affectation : Recopie, si variables de même type, sinon « Cast
+ Recopie »,
Implicite (ie. Caché) entre les types de Base.
• Exemples :
char c, c1; int i, i1; float f, f1; double d, d1;
c = c1; i = i1; f = f1; d = d1; // Affectations
(int)c; (double)f; // Cast
c = (char)i; d = f; i = d; // Cast puis affectation
• Avec de Nouveaux Types de Données : ex : Nombres Complexes
Types non standards C++,
A vous de définir les opérateurs de Cast et d’Affectation
• Possibilité:
D’un Type de Base vers un Nouveau Type,
D’un Nouveau Type vers un Type de Base,
Entre Nouveaux Types.
Opérateurs de Cast et
Opérateur d’Affectation = en C++
• Cast et Affectation:
Cast : en un Type de Base,
Affectation : en un Objet
• Nouvelle Syntaxe :
N = int(x); // n = (int)x;
(PTestOperateurCastSimple)
L’Ancienne C reste possible,
et même à utiliser si la
nouvelle est sur-définie !
• Nouvelles Possibilités :
Cast avec les types de base,
Cast entre nouveaux types,
Affectations
• Opérateur de Cast :
Méthode,
Syntaxe : le type de la valeur
de retour n’est pas
mentionné
(PTestOperateurCast)
Opérateurs de Cast et Opérateur
d’Affectation en C++
• Cast:
Implicites lors de
l’Affectation;
• Affectations:
• Code de l’Affectation :
Surcharge pour chaque
Type
Les Patrons de Fonctions
• Syntaxe:
template
<class T>
Prototype « classique » en T
• Sur-Définition:
• Correspondance Exacte :
T est un type donné !
Les Patrons de Fonctions
Exemple :
• Syntaxe :
Template <class T>,
point <int> …
Les Patrons de Classes :
Avec Spécification
1. Héritage:
2. Construction / Destruction:
3. Encapsulation / Contrôle d’Accès:
4. Héritage et Patron de Classes:
5. La Classe Virtuelle:
6. Polymorphisme:
7. Ligatures Statiques / Dynamiques : Fonctions
Virtuelles:
8. Fonctions Virtuelles Pures et Classes Abstraites:
L’HERITAGE
• Exemple:
Classe de Base : point :
Coordonnée x, y
Classe Dérivée : pixel =
point + intensité
• Syntaxe :
« : public point »
• Sur Définition :
Affiche()
Utilisable avec les 2
classes
(PPointPixel)
L’HERITAGE :
Construction et Destruction
• Construction:
Appel Constructeur de la
Classe de Base, puis Dérivée
Pris en charge par le C++
• Destruction:
Ordre Inverse : Dérivée,
puis Base
• Initialisation dans la
Construction:
Liaison des Constructeurs :
comme pour les Objets
Membres
L’HERITAGE et l’Encapsulation:
Contrôle des Accès
• Contrôle des Accès à 2 niveaux:
Conception de la Classe de Base,
Conception de la Classe Dérivée
• Contrôle au Niveau de la Classe de Base :
Statuts : Public et Privé, classe et utilisateurs,
Nouveau Statut : Protégé « protected » : intermédiaire :
o Public vis-à-vis de la classe dérivée : possibilité d’accès
direct au champ,
o Privé vis-à-vis de l’utilisateur.
• Contrôle au Niveau de la Classe Dérivée:
« class Derivee : public Base » : Ne modifie pas les droits de
la classe de Base
« class Derivee : private Base » : Rend Privé pour les
utilisateurs la classe Dérivée : La classe Dérivée réalise
l’Encapsulation de la Classe de Base.
(PTestDroitAcces et PTestDroitAccesEncap)
L’HERITAGE
et Statut « protected »
• Données et Méthodes de la
Classe de Base :
Rappel : Appartiennent à
la Classe Dérivée,
Accès Direct : Possible !
Accès Direct : Impossible
avec private!
Encapsulation de la Classe
de Base
• Encapsulation des Données
de la Classe de Base :
Accès Direct : Impossible !
Accès par LectureBase()!
Héritage Réitéré
• Possibilité de Réitération de
l’Héritage :
La Classe Dérivée devient
Classe de Base,
Appel Constructeurs /
Destructeurs
(PTestHeritageReitere)
Héritage et Patrons de Classes
• 3 Possibilités :
Classe Ordinaire Dérivée d’une instance de Patron de
Classes,
Patron de Classes, Dérivé d’une Classe Ordinaire,
Patron de Classes, Dérivé d’un Patron de Classes, avec
« template commun » ou non.
• 3 Exemples :
Classe pixelint, dérivée de l’instance <int> du patron de
classes pointP,
(PTestPatronHeritage)
Patron de Classes pixelC, dérivée de la classe point,
(PTestPatronHeritage1)
Patron de Classes pixelP, dérivée du Patron de classes pointP,
avec « template non commun ».
(PTestPatronHeritage2)
Classe Ordinaire Héritant d’une
instance de Patron de Classes
Patron de Classes Héritant
d’une Classe
Patron de Classes Héritant
d’unPatron de Classes
(Template non commun)
Héritage Multiple
• Généralisation de l’Héritage
Simple:
Une Classe Dérive d’au moins
deux Classes de Base,
• Syntaxe:
Définition de la Classe,
Constructeur
• Appel Constructeur :
Base : dans l’ordre déclaré, puis
dérivée
• Appel Destructeur :
Sens Inverse
• Possibilité d’avoir des champs de
même nom dans ldes classes
dérivées:
Espaces noms
(PTestHeritageMultipleSimple)
Héritage Multiple
Héritage et Mémorisations
Multiples
• Mise en Oeuvre :
Try
Throw
Catch
En Résumé (1):
• La Classe:
Regroupe données et méthodes,
Permet l’encapsulation : protection des données, donc
création d’interface.
Qualificatifs : private (par défaut), public (pour les
interfaces)
Fonction Membres : utilisation de l’Espace Nom,
Appel de Méthode : Objet privillégié.
• Notion d’Amitié:
Pour assouplir l’encapsulation : accès aux données privées
d’une classe,
Fonction indépendante, méthode d’une autre classe etc …
• Surcharge:
Variables (dangereux)
Fonctions indépendantes ou membres et Opérateurs :
signature : nombre et types de paramètres : Attention aux
paramètres par défaut, et à l’impossibilité de distinguer
variable de référence.
En Résumé (2):
• Référence:
Ressemble à une variable,
Permet le retour d’un paramètre modifié.
• Paramètres par Défaut:
Commence par les derniers,
En priorité par rapport à la surcharge.
• Constructeur:
Méthode particulière, appelée à la création de l’objet :
statique ou dynamique (new),
Existe par défaut, SANS paramètre,
Permet l’initialisation,
L’écriture d’un constructeur annule l’utilisation du
constructeur par défaut, SANS paramètre,
Permet la construction d’un objet complexe.
• Destructeur:
Méthode particulière, appelée à la destruction de l’objet :
statique ou dynamique (delete), Existe par défaut
Permet la destruction d’un objet complexe. (sinon visualise la
durée de vie)
En Résumé (3):