Documente Academic
Documente Profesional
Documente Cultură
2018/2019
Cahier
Analyse
de charges
Conception
Client
Implémentation
Test
Livraison
Maintenance
Cahier
Analyse
de charges
Méthodes et Langages de
Modélisation:
Conception SADT, SA-RT, MERISE, OMT,
UML, …
Client
Langages de Programmation:
Implémentation Fortran, C, Ada, SmallTalk, Java,
C++, …
Test
Livraison
Maintenance
Tous les langages de programmation ont le même but: nous permettre de parler à
l'ordinateur plus simplement qu'en binaire.
En programmation, la notion
de « niveau » est relative.
Il n'existe pas de méthode
particulière qui permettrait de
déterminer objectivement si
un langage peut être
considéré de bas niveau ou
de haut niveau.
openclassrooms.com
prolland.free.fr
Données
Données
Traitements
Traitements
Données Traitements
Données Données
Traitements Traitements
Réutilisation très
difficile!
Classe Rectangle
double largeur
double hauteur
double surface( )
rect1 {…..} rect3
largeur = 4 largeur = 5
Objets hauteur = 2
rect2 hauteur = 8
largeur = 3.2
hauteur = 4.2
Conception Programmation
Langages de Langages de
Modélisation Programmation
Orientée-Objet Orientée-Objet
3 Polymorphisme
rect3
Se focaliser sur l’essentiel, et cacher les détailles
largeur = 5
hauteur = 8
Interfaces
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
1 Encapsulation/Abstraction
Programmeur Programmeur
Développeur Utilisateur
Interfaces
Méthodes visibles
L'héritage est un concept très important qui représente une part non
négligeable de l'intérêt de la programmation orientée objet.
Il consiste à définir différents niveaux d'abstraction.
L'héritage établit une relation de spécialisation/généralisation entre
les classes.
Il permet de construire des classes (sous-classes) à partir de classes
existantes (classes mères, super classes, classes de bases).
Spécification
Attributs Organiser le code.
méthodes
Classe B Classe C
Exemples:
une voiture est un véhicule (Voiture hérite de Véhicule) ;
un bus est un véhicule (Bus hérite de Véhicule) ;
un corbeau est un oiseau (Corbeau hérite d'Oiseau) ;
un chirurgien est un docteur (Chirurgien hérite de Docteur).
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
3 Polymorphisme
Calcul_salaire()
secrétaire Ingénieur
Calcul_salaire()
Calcul_salaire()
ClasseA
attribut1
attribut2
Attributs Attribut3
…..
méthode1()
Méthodes méthode2()
….
type attribut2;
Droits d’accès - attribut2:type
protected:
+ public #attribut3: type
type attribut3;
- private
public: # protected +méthode1()
type Methode1(arguments) +méthode2()
{ // définition de la methode1 } Méthodes
type Methode2(arguments)
{ // définition de la methode2} Règle d’encapsulation:
}; Tous les attributs d’une classe
doivent toujours êtres privés (ou
projetés).
public:
double surface ()
{ return hauteur * largeur; }
};
public:
double surface () const
{ return hauteur * largeur; }
}; largeur = 5
hauteur = 8
Int main() {
Rectangle rect1;
rect1.hauteur = 2;
rect1.largeur = 4;
cout <<rect1.surface()<<endl;
}
class Rectangle {
private:
double hauteur; Tous les attributs sont
double largeur; en mode privé!
On peut pas y accéder
public: depuis l’extérieur de la
double surface () const classe!!!!
{ return hauteur * largeur; }
};
Int main() {
Comment faire pour les
Rectangle rect1;
initialiser alors??!!
rect1.hauteur = 2;
rect1.largeur = 4;
cout <<Rect1.surface()<<endl;
}
class Rectangle {
private:
double hauteur;
double largeur; Setter: Action qui permet:
public: Modification des valeurs des attributs;
void setHauteur (double h) { hauteur = h; }
void setLargeur (double L) { largeur = L; } Affectation des valeurs aux attributs.
double getHauteur () const { return hauteur ; }
=> Pas de retour .
double getLargeur () const { return largeur ; }
double surface () const Gettre: Prédicat qui permet:
{ return hauteur * largeur; } Consultation d’un attribut: lecture
}; seule.
Int main() {
Rectangle rect1; => Retour de la valeur d’un attribut.
rect1.setHauteur (2); rect1.setLargeur (4);
cout <<rect1.getHauteur()<<endl;
cout <<rect1.getLargeur()<<endl;
cout <<rect1.surface()<<endl;
}
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
Solution 2:
Les Constructeurs
public:
nomConstructeur (arguments)
{ //Initialisation des attributs }
Ou:
public:
nomConstructeur (arguments) : initialisation1, initialisation2 //liste
//d'initialisations
{ } //le corp est vide
Ou: ~nomDestructeur(){
delete attribut1;
delete attribut2;
}
class NomClasse {
private:
static type attribut1;
};
class NomClasse {
public:
static type methode () { return variable ;}
};
class ClasseA {
…..
puclic:
friend type nomFonction (arguments); //fonction amie globale
friend type ClasseB :: nomMethode (arguments); //fonction amie membre d’une classe B
};
class ClasseA {
…..
};
class ClasseB {
….
puclic:
friend class ClasseA; //ClasseA est amie de ClasseB
};
Note:
si la classe A est amie de la classe B, ¸ca ne veut pas dire
que B est amie de la classe C.
Classe B Classe C
class Forme { };
class Rectangle : public Forme { };
class Polygone {
protected:
double hauteur;
double largeur;
public:
void set_values (double h, double L) { hauteur=h; largeur=L; }
};
class Rectangle : public Polygone {
double surface () const { return hauteur * largeur; }
};
class Triangle : public Polygone {
double surface () const { return largeur* hauteur / 2; }
};
int main () {
ClasseB b; ClasseC c; ClasseD d; Classe A * ptr;
ptr = &B; // OK
ptr = &C; // Erreur (ca ne marchera que dans C et toutes ses dérivées)
ptr = &D; // Erreur (ca ne marchera que dans D
}
class ClasseA {
…..
Public:
ClasseA () { cout << “constructeur sans paramètres - constructeur par défaut" <<endl; }
ClasseA (int a) { cout << " constructeur avec un paramètre " <<endl; }
~ ClasseA () {cout << " Destructeur " <<endl; }
};
class ClasseB : public ClasseA {
…..
Public:
ClasseB (int a) : ClasseA (a) { cout << " constructeur avec un paramètre " <<endl; }
~ ClasseB () {cout << " Destructeur " <<endl; }
};
int main () {
ClasseB b(1);
}
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
Une classe peut hériter des attributs et des
méthodes de différentes classes de base.
Syntaxe: Classe A Classe B
Grace à l'héritage, le même code pourra être appliqué aux différentes sous-
classes .
class Vehicule{
....
public:
virtual void afficher( );
….
};
…
void presenter(Vehicule &v )
// ou :
// void presenter(Vehicule const&v )
{ v.afficher ( ); }
openclassrooms.com
Si l'on ne sait pas quoi mettre dans le corps d'une méthode de la classe
mère, on peut la déclarer virtuelle pure.
Une fonction membre est dite virtuelle pure lorsqu’elle est déclarée de la
façon suivante : virtual type nomMethode(paramètres) = 0;
une méthode virtuelle peut être redéfinie dans une classe fille .
une méthode virtuelle pure doit être redéfinie dans une classe fille.
Un constructeur ne peut pas être virtuel: il sait quel type d’objet il va
construire.
=> pas besoin de résolution dynamique ses liens.
On ne peut pas appeler de méthode virtuelle dans un constructeur.
Quel destructeur va
être appelé? !
Note:
Il ne faut pas
oublier d’inclure
la bibliothèque
<vector>
Exemple:
l'appel à la méthode
nbrRoues() est
polymorphique: pointeur +
méthode virtuelle.
=> C'est la « version Voiture»
qui est appelée, même si la
«versionVehicule» n'existe
pas.
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE
« Apprendre le C++ », M. Hamemerchmidt.
« Apprendre le C++ », C. Delonnoy.
« Programmation en Langage C++ : Cours et Travaux Pratiques », B.
Boukhezzar.
http://www.cplusplus.com/doc/tutorial/
https://openclassrooms.com/courses/programmez-avec-le-langage-
c/qu-est-ce-que-le-c-2
https://fr.coursera.org/learn/cpp-poo
http://carl.seleborg.free.fr/cpp/cours/index_cours.html