01 Introduction C++
01 Introduction C++
01 Introduction C++
Sid Mohammed Ben Abdellah
Ecole Nationale des Sciences Appliquées
Fès
Programmation Orientée Objet
C++
Pr. Nabil EL AKKAD
2
Description du module
• Introduction à l'orienté objet;
• Spécificité de C++;
• Classes et objets;
• Propriétés des fonctions membres ;
• Construction, destruction et initialisation des objets ;
• Surdéfinition des opérateurs;
• Héritage simple, multiple et virtuel;
• Templates ;
• Notion de la bibliothèque STL ;
• …
Evaluations :
• DS, TPs (colle), Projets + exposés. 3
Documentations
• Petit manuel de survie pour C++ de François Laroussinie, 2004-2005,
http://www.lsv.ens-cachan.fr/~fl/Cours/docCpp.pdf
• Introduction à C++ de Etienne Alard, revu par Christian Bac, Philippe
Lalevée et Chantal Taconet, 2000
– http://www-inf.int-evry.fr/COURS/C++/CoursEA/
• Thinking in C++ de Bruce Eckel, 2003 http://w2.syronex.com/jmr/eckel/
• http://www.stroustrup.com/C++.html
• http://channel9.msdn.com/Events/GoingNative/2013/Opening-Keynote-
Bjarne-Stroustrup
• Aide en ligne :
– http://www.cplusplus.com/doc/tutorial/
– https://www.coursera.org/course/intropoocpp
• Ouvrage :Claude Delannoy: C++ pour les programmeurs
• Livres gratuits en ligne : http://it-ebooks.info/book/1256/
• Aide en ligne : http://www.cplusplus.com/doc/tutorial/ 4
Problématique de la programmation
Introduction
• Pour certains, il suffit d’enchaîner des instructions élémentaires pour
parvenir à résoudre n’importe quel problème ou presque.
• Pour d’autres au contraire, il s’agit de produire (au sens industriel du
terme) des logiciels avec des exigences de qualité qu’on tente de
mesurer suivant certains critères, notamment :
– L’exactitude : aptitude d’un logiciel à fournir les résultats voulus,
dans des conditions normales d’utilisation (par exemple, données
correspondant aux spécifications) ;
– La robustesse : aptitude à bien réagir lorsqu’on s’écarte des
conditions normales d’utilisation ; 5
Problématique de la programmation(suite)
6
Problématique de la programmation(suite)
Modularité
• Les critères cités précédemment influencent sur la manière de conception d’un
• Plusieurs critères ne sont pas respectés si l’architecture d’un logiciel n’est pas claire.
répercutions importantes sur le logiciel, ce qui impose une lourde charge de travail
• Les modules sont des entités indépendantes intégrées dans une architecture pour
produire un logiciel. 7
De la programmation classique vers la POO
8
De la programmation classique vers la POO (suite)
• Approche procédurale ou classique: permet de découper un pg en un
ensemble de procédures ou fonctions. Ces procédures contiennent des
instructions qui ont pour but la réalisation d’un traitement particulier.
Exemples:
Calcul de vitesse d’une voiture
Résolution d’une équation.
Affichage des notes des étudiants
...
Dans le cas de cette approche, procédurale, comme C, Pascal, Fortran, un
programme correspond à la collection d’un ensemble de fonctions qui
s’appellent entre elles.
9
De la programmation classique vers la POO (suite)
• Approche procédurale favorise:
Création d'un programme plus modulaire et structuré;
Possibilité de réutiliser le même code sans avoir à le retaper.
En contre partie, cette approche a également quelques inconvénients:
o Les procédures et les fonctions accèdent à une zone où les données sont
stockées.
- Il y a une dissociation entre les données et les procédures.
Ce qui pose des difficultés et problèmes lorsque l’on veut changer
les structures de données.
o Les fonctions s’appellent entre elles et peuvent agir sur les mêmes données.
ce qui entraine un risque de partage de données: écriture en même temps
10
dans le même fichier.
De la programmation classique vers la POO (suite)
• La programmation structurée a fait progresser la qualité de la production des
logiciels.
• Mais, ses propres fondements lui imposent des limitations "naturelles". En
effet, la programmation structurée repose sur ce qu’on nomme souvent
"l’équation de Wirth", à savoir :
Algorithmes + Structures de données = Programmes
• Structurer les programmes pour améliorer : l’exactitude, la robustesse,
l’extensibilité et la réutilisabilité.
• En pratique, on s’est aperçu que l’adaptation ou la réutilisation d’un logiciel
conduit souvent à "casser" le module intéressant, et ceci car il est
nécessaire de remettre en cause une structure de données.
• La cause : équation de Wirth, qui découple les données des procédures
(agissant sur ces données).
11
De la programmation classique vers la POO (suite)
Dans ce schéma, on a un lien fort entre les données et les fonctions qui y 12
accèdent.
Programmation structurée
Quelques conclusions
• Procédural ou structuré, comme le C:
– On définit des fonctions s'appelant mutuellement.
– Chaque procédure, ou fonction, est associée à un traitement particulier
pouvant être décomposé en sous traitements jusqu'à obtenir des fonctions
basiques.
– En général, le procédural travaille sur le verbe ou l'action.
Exemple: pour déterminer la vitesse d’une voiture, le principe du procédural
permet de faire : « DetermineVitesse(Voiture) » partout où cela est
nécessaire. Le code, ayant une référence à une « Voiture », est donc
fondé et dispersé dans l'ensemble des programmes.
• Orienté Objet (OO ):, comme C++
– On manipule uniquement des objets.
– Des ensembles groupés de méthodes et de variables associées à des entités
intégrant ces variables et ces méthodes.
– Le sujet, dans ce cas, est prépondérant: disposant d'un objet « Voiture », on
fait spontanément : Voiture.DetermineVitesse(). Tout le code lié à l'objet «
Voiture » se trouve ainsi regroupé. 13
POO et programmation structurée
• Avantages de POO:
– POO remplace, peu à peu, le procédural dans les grands programmes, puisqu’il a
plusieurs avantages:
Facilité d'organisation, méthode plus intuitive, réutilisation, possibilité d'héritage,
projets plus faciles à gérer , facilité de correction.
Le principal intérêt de POO est qu’on ne décrit plus par le code des actions à
effectuer de façon linéaire, mais par des ensembles cohérents appelés « objets ».
– POO est facilement concevable, puisqu’il décrit des entités comme il en existe dans
le monde réel.
Alors, l'objet « Voiture » implémentant la méthode « Voiture.accelerer » et
possédant la propriété « Voiture.roue » est conçu facilement et peut être utilisée.
Par exemple:
Dans une simulation de course automobile, on va faire interagir un ensembles
d’objets de type Voiture. Les modèles à objets sont créés pour modéliser le monde
réel.
Dans un modèle à objets: toute entité du monde réel représente un objet et vice
versa. 14
POO et programmation structurée
(suite)
• Avantages (suite):
type de données.
15
Apports de la Programmation Orientée
Objet (POO)
– Programmation Orientée Objet :
Equation de la POO : Méthodes + Données = Objet
Méthode
- Formuler une stratégie de résolution du problème;
- Isoler les objets qui font partie de la solution et identifier les opérations
sur les objets;
- Regrouper, avec chaque objet, les opérations qui lui sont associées;
- Déduire la spécification des modules.
Démarche d’une méthode orientée objet
- Définir le problème;
- Développer une stratégie informelle de résolution;
- Définir les objets et leurs attributs;
- Identifier les opérations sur les objets
- Etablir les interfaces
- Implémenter les objets
16
Répéter ce processus, récursivement, en cas de besoin.
Apports de la POO (suite)
Les grands principes de la P.O.O. sont les suivants:
– Objet et Classe
– Encapsulation
– Héritage
– Typage
Vérifications de type + stricte
– Polymorphisme
Surcharge de fonctions et des
opérateurs
Références
Gestion mémoire + facile
C++ = C + Entrées/sorties + facile
Classes et héritage
Polymoryhisme
Fonctions amies (originalité)
Programmation générique 17
Apports de la POO (suite)
Terminologie de base :
Programme : fonction, bloc, variable, constante, type, instruction, opérateur
Fonction: un emplacement mémoire « adresse de début d’un sous programme »,
Bloc : ensemble de définitions de variables et d’instructions délimité par {...},
Variable: un emplacement mémoire, qui peu être dynamique « locale » ou statique
« globale ».
Constante: un emplacement mémoire. C’est le code machine du programme,
Type : définit les caractéristiques d’un ou plusieurs noms.
Nom: identificateur qui représente une fonction, une variable, une constante, …,
Définition: présente les caractéristiques d’un ou plusieurs noms et réserve de la
place mémoire à ceux-ci.
Déclaration (prototype) : présente les caractéristiques d’un ou plusieurs noms,
Classe: type qui regroupant des données et des fonctions et précisant les droits
d’accès à ces derniers,
18
Objet: instance de la classe « variable ».
Apports de la POO (suite)
Conception par objet
- Dans la conception qui se base sur les données, une réflexion autour des données
conduit à :
Réaliser, pour chaque type de données, les fonctions qui permettent de les
manipuler.
Exemple 2:
Fichier
nom, répertoire, protections,
État
contenu, ...
Comportement
ouvrir, fermer, supprimer,
(Opérations) 20
Apports de la POO (suite)
Notion d’encapsulation
• L’encapsulation des données signifie qu’il n’est pas possible d’agir directement sur les données
d’un objet.
• Il est nécessaire de passer par l’intermédiaire de ses méthodes, qui jouent ainsi le rôle
d’interface obligatoire.
• Les données privées ne peuvent être manipulées que par les méthodes de la classe.
• L’encapsulation des données présente un intérêt manifeste en matière de qualité de logiciel.
Une modification éventuelle de la structure des données d’un objet n’a d’incidence que sur l’objet lui-même:
Les utilisateurs de l’objet ne seront pas concernés par la teneur de cette modification (ce qui n’est pas
le cas avec la programmation structurée).
De la même manière, l’encapsulation des données facilite grandement la réutilisation d’un objet.
21
Apports de la POO (suite)
Notion de Classe
• En P.O.O. apparaît le concept de classe:
– Qui correspond simplement à la généralisation de la notion de type qu’on
rencontre dans les langages classiques.
22
Apports de la POO (suite)
Exemple 1:
Personne
-Nom : string
-Prenom : string
-Age : int
+affiche() : void
+calculeAge() : int
Exemple 2:
Materiel
-Nom :string
-Prix : double
-Nombre : int
+affiche() : void
+achete() : void 23
Apports de la POO (suite)
Classe Instances
25
Apports de la POO (suite)
Notion d’Héritage (suite)
Ce concept permettant d'ajouter des nouvelles fonctionnalités à une classe à
partir de la création d’une sous-classe héritant des propriétés de la classe de
base et à laquelle s’ajoutent des nouvelles propriétés.
La classe héritée s’appelle sous-classe (classe dérivée) de la classe mère (super-
classe).
L'héritage permettant à une classe dérivée d'étendre les propriétés de la classe
de base tout en héritant des attributs et des méthodes de cette classe de base.
L’héritage en C++, permet à une classe soit d’hériter d'une seule classe de base:
on parle d’héritage simple., ou de plusieurs classes: c’est de l’héritage multiple.
L’héritage en java ne permet à une classe d’hériter que d'une seule classe de
base (héritage simple).
Apports de la POO (suite)
Notion d’Héritage (suite)
L’héritage permet de définir une nouvelle classe à partir d’une classe
existante, à laquelle on ajoute de nouvelles données et méthodes.
Exemple 1:
Personne
-Nom : string
-Prenom : string
-Age : int
+affiche() : void
+calculeAge() : int
Etudiant Enseignant
-cne : int -ppr: int
+affiche() : void +affiche() : void
Apports de la POO (suite)
Notion d’Héritage (suite)
Exemple 2:
Materiel
-nom : string
-prix : string
-nombre : int
+affiche() : void
+achete(): void
Telephone Ordinateur
-autonomie : int -µp : string
-4G : bool -frequence : int
-resolution : String -memoire : int
+affiche() : void +affiche() : void
Apports de la POO (suite)
Notion du Polymorphisme
• En P.O.O, une classe dérivée peut "redéfinir" (modifier) certaines des
méthodes héritées de sa classe de base.
• Cette possibilité est la clé de ce qu’on appelle le polymorphisme:
C’est-à-dire la possibilité de traiter de la même manière des objets de
types différents, pour qu’ils soient tous de classes dérivées de la même
classe de base.
• Plus précisément, on utilise chaque objet comme s’il était de cette classe
de base, mais son comportement effectif dépend de sa classe effective
(dérivée de sa classe de base);
En particulier de la manière dont ses propres méthodes ont été redéfinies.
• Le polymorphisme améliore l’extensibilité des programmes, en
permettant d’ajouter de nouveaux objets dans un scénario préétabli.
29
Historique de C++
• 3ème langage le plus utilisé au monde (classements TIOBE de février 2016
http://www.tiobe.com/index.php/tiobe_index)
• JVM (HotSpot) et une partie du noyau de Google Chrome écrits en C++
• En1980 : Première version développée par Bjarne Stroustrup de Bell Labs AT&T
• 1985 Langage C++, parution du livre Bjarne Stroustrup
http://www.research.att.com/~bs/homepage.html
• Appelé à l’origine « Langage C avec classes »
• Devenu une norme ANSI/ISO C++ en juillet 1998 (C++98 - ISO/IEC 14882) – mise à jour
en 2003 (C++03)
– ANSI : American National Standard Institute
– ISO : International Standard Organization
• Nouvelle norme C++ : C++11
– C++11 (C++0x) approuvée par l’ISO en 12/08/2011 et disponible depuis septembre 2011
(norme ISO/CEI 14882:2011)
• C++14 : révision mineure de C++11
– http://electronicdesign.com/dev-tools/bjarne-stroustrup-talks-about-c14
– http://www1.cs.columbia.edu/~aho/cs4115/lectures/14-01-29_Stroustrup.pdf
• Nouvelle mise à jour annoncée pour 2017
• Mise à jour, décembre 2020 (C++ 20) 30
Historique de C++ (suite)
33
POO et C++ (suite)
• La pile
La pile est un espace mémoire réservé au stockage des variables désallouées
automatiquement..
La pile comporte les variables déclarées au sein des fonctions ou à l’intérieur
des blocs « {….} »;
Ces variables s’appellent variables « locales » ou « automatiques »;
Ces variables sont crées au moment de l’appel de la fonction et supprimées à
la sortie de la fonction. « ou à l’entrée et à la sortie du bloc »;
Les durées de vie de ces variables est la durée de vie de la fonction ou du
bloc.
34
POO et C++ (suite)
• La zone statique
La zone d’allocation statique comporte les variables déclarées à
l’extérieur de toute fonction ou au sein d’une fonction mais avec le
mot clé « static »;
Ces variables s’appellent variables « globales » ou « statiques »;
Ces variables sont crées au moment de l’ exécution du programme et
supprimées à sa fin.
Les durées de vie de ces variables est la durée de vie du programme.
35
POO et C++ (suite)
• Le tas
Le tas comprend les variables crées par le programme au moment de son
exécution. C’est de « l’allocation dynamique ».
Ces variables s’appellent variables « dynamiques »;
Elle sont crées au moment ou le programme exploite l’opérateur « new »
et supprimées au moment de l’utilisation de l’opérateur « delete ».
Les durées de vie de ces variables sont alors variables. Elles commencent
à l’exécution du « new » et se termine à l’exécution de « delete ».
En cas d’oublie de l’appel à « delete », par le programmeur, sur une
variable crée avec « new » , celle‐ci sera supprimée à la fin de l’exécution
du programme. 36
POO et C++ (suite)
• Certains langages peuvent être conçus (de toutes pièces) pour appliquer à la
lettre ces principes et réaliser la P.O.O. "pure".
– Simula, Smalltalk ou, Java.
• A l’opposé, on peut toujours tenter d’appliquer "une philosophie P.O.O." à un
langage classique (Pascal, C...).
• Le langage C++ se situe à mi‐chemin entre ces deux points de vue. Il a en effet
été obtenu en ajoutant à un langage classique (C) les outils permettant de mettre
en œuvre tous les principes de la P.O.O.
• La solution adoptée par Bajarne Stroustrup a le mérite de préserver l’existant
(compatibilité avec C++, des programmes déjà écrits en C) ;
Elle permet également une "transition en douceur" de la programmation
structurée vers la P.O.O.
En revanche, elle n’impose nullement l’application stricte des principes de P.O.O.
37
Langage compilé
Etapes qui ont lieu avant l'exécution pour un langage compilé comme C++
Fichier
de Librairies
code
Programme
Compilation Code objet Edition de liens
exécutable
Autres code objet
Fichier
d'entête
38
Langage interprété
Cas de Java
Avant exécution Exécution
Autres byte code
Fichier
Byte code Machine virtuelle
de code Compilation
Java (JVM)
Java
39
Les commentaires
//…Texte…
Commence dès // et se termine à la fin de la ligne.
Sur une seule ligne.
A utiliser de préférence pour les commentaires généraux.
/* …Texte…*/
Le texte entre /* et */ est ignoré par le compilateur.
Peuvent s’étendre sur plusieurs lignes.
Peuvent être utilisés pour désactiver, temporairement, une zone
de code.
Les types de bases
• En C++, tout est objet sauf les types de base.
• Il existe plusieurs types de base, à savoir:
–Un type booléen pour représenter les variables ne pouvant prendre
que 2 valeurs (vrai ou faux : 0 ou 1, etc.) : bool avec les valeurs
associées true et false.
–Quelques types pour représenter les caractères : char, unsigned char
–Quelques types pour représenter les entiers de diverses tailles : int,
short int, unsigned short int et long int,…
–Quelques types pour les réelles : float et double, long double
• La taille nécessaire au stockage de ces types est indépendante de la
machine.
– Avantage : portabilité
– Inconvénient : "conversions" coûteuses
Les types de bases (2)
• Quelques opérations sur les entiers
– les opérateurs d’incrémentation ++ et de
décrémentation et ‐‐
• ajoute ou retranche 1 à une variable
int n = 12;
n ++; //Maintenant n vaut 13
• n++; « équivalent à » n = n+1; n‐‐; « équivalent à » n = n‐1;
• 8++; est une instruction illégale.
• Peut s’utiliser de manière suffixée : ++n. La différence avec la
version préfixée se voit quand on les utilisent dans les expressions.
En version suffixée l’incrémentation ou la décrémentation s’effectue
en premier.
Exemples:
int m=7; int n=7;
int a=2 * ++m; //a vaut 16, m vaut 8
int b=2 * n++; //b vaut 14, n vaut 8
Les opérateurs
Opérateurs arithmétiques
Opérateurs d’affectations
= Affectation x=2
‐= Soustraction et x‐=2
Opérateurs affectation
d’affectation
+= Addition et x+=2
affectation
Les opérateurs (2)
Opérateurs relationnels
Opérateurs logiques
&& et a && b
Opérateurs
logiques || ou a ||b
! non !a
– if, else
– for
– while
– do, while
Les structures de contrôle (2)
Structure if
if (expression logique) instruction;
if (expression logique)
{ instruction;
instruction;
...
}
Structure if else
if (expression logique) instruction;
else instruction;
if (expression logique)
{ instruction;
instruction;
...
}
else
{ instruction;
instruction;
...
}
Les structures de contrôle (3)
Boucle for
Boucle while
Exemples:
char c= “”;
for(int i = 0; i < 100; i++) {
// Donner une valeur à c à chaque itération
switch(c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'y': cout<<" voyelle “<<endl; break;
default: cout<<" Consonne"<<endl; break;
Les structures de contrôle (5)
L’instruction break : permet de terminer l’exécution d’une boucle.
Exemple :// Impression des nombres premiers entre 2 et 50.
int n = 50;
bool premier = true;
for (int i = 2; i <= n; i++)
{
premier = true;
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
premier = false;
break;
}
}
if (premier)
cout<<" le nombre“<<i<<" est premier“ <<endl;
}
Les structures de contrôle (6)
int somme = 0;
for (int i = 0; i < 100; i++)
{
if (i % 2 == 0) continue;
somme += i;
}
Les tableaux
Les tableaux, en C++, sont des structures pouvant contenir:
- Un nombre fixe d'éléments de même nature.
- Il peut s'agir d'objets ou de primitives.
Tableaux unidimensionnels
Déclaration : type nomTableau [] ; ou type [] nomTableau ;
Exemple : int t[] ; peut aussi s’écrire : int [] t ;
La différence entre les deux formes :
int [] t1, t2 ; équivalent à int t1[], t2[] ;
int t1[], n, t2[] ; // mélange entre tableaux d’entiers et primitive entier
Les éléments d’un tableau peuvent être d’un type primitif ou d’un type
objet:
Point tp [] ; // tp est une référence à un tableau d’objets de type Point
Point a, tp[], b ; // a et b sont des références à des objets de type Point.
tp est une référence à un tableau d’objets de type Point
Les tableaux (2)
Tableaux unidimensionnels (2)
Création
La création d’un tableau dans C++ est réalisée par l’opérateur new :
type * nomTableau ;
nomTableau = new type [dimension];
Exemple : int *t= new int[50];
Initialisation
Automatique: Chaque élément du tableau est initialisé selon son
type par l'instruction new :
0 pour les numériques,
\0 pour les caractères,
false pour les booléens
null pour les chaînes de caractères et les autres objets.
Un tableau est un objet possédant l'attribut length : c'est la taille
du tableau.
Exemple :
int t[] = new int[5] ; cout<<"taille de t : " + t.length<<endl ; // affiche 5
Les tableaux (3)
Exemple :
#include <iostream>
using namespace std;
int main() {
int i;
int const tailleTableau(10); //taille du tableau
int tableau[tailleTableau]; //déclaration du tableau
for (int i(0); i<tailleTableau; i++ ) {
tableau[i]=i*i;
cout<<"Le tableau ["<<i<<"] contient la valeur "<<tableau[i]<<endl;
}
return 0;
}
Les tableaux (4)
Exemple 2 :
#include <iostream>
using namespace std;
int main() {
int i, taille;
cout << "Tapez la valeur de taille : ";
cin >> taille;
int *t; t = new int[taille];
for (i = 0; i < taille; i++)
t[i] = i * i;
for (i = 0; i < taille; i++)
cout << t[i] << endl;
delete[] t;
return 0;
}