Académique Documents
Professionnel Documents
Culture Documents
Chapitre 1. Introduction à la
programmation orientée objets
(POO)
Objectifs de la programmation
La programmation structurée
Objet
La P.O.O est fondée justement sur le concept d’objet, c’est une association des données et
des procédures (méthodes) agissant sur ces données. :
Exemple :
Objet: voiture, répond au message: tourner la clé de contact.
Un objet est formé de :
9 données => définissent ce qu'il est,
9 programmes ou procédures => définissent ce qu'il peut faire,
Un objet est un regroupement dans une entité indépendante de données et de procédures qui
manipulent ces données. Ces procédures sont appelées MÉTHODES.
Encapsulation
Encapsuler les 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. On traduit parfois cela en disant que l’appel d’une méthode est en
fait l’envoi d’un « message » à l’objet. (Protection de certaines données : meilleure
sécurité)
L’encapsulation des données facilite grandement la réutilisation d’un objet
Classe
Le concept de classe, à la généralisation de la notion de type que l’on rencontre dans les
langages classiques. En effet, une classe n’est rien d’autre que la description d’un ensemble
d’objets ayant une structure de données commune et disposant des mêmes méthodes. Les
objets apparaissent alors comme des variables d’un tel type classe (on dit aussi qu’un objet
est une « instance » de sa classe).
Héritage
Mme MECHID Page 3
Héritage permet de définir une nouvelle classe à partir d’une classe existante à laquelle on
ajoute de nouvelles données et de nouvelles méthodes.
L’héritage facilite largement la réutilisation de produits existants.
Polymorphisme
Faculté qu'ont des objets différents de réagir différemment en réponse au même message
En Résumé
Pour qu'un langage soit orienté objet, il doit être conforme aux 3 principes de base de
l'orientation objet:
9 Encapsulation des données
9 Structure de Classes
9 Héritage
#include <iostream>
#include <cmath>
using namespace std ;
main()
{ int i ;
float x ;
float racx ;
const int NFOIS = 5 ;
cout << "Bonjour\n" ;
cout << "Je vais vous calculer " << NFOIS << " racines carrees\n" ;
for (i=0 ; i<NFOIS ; i++)
{ cout << "Donnez un nombre : " ;
cin >> x ;
if (x < 0.0)
cout << "Le nombre " << x << "ne possede pas de racine carree\n " ;
else
{ racx = sqrt (x) ;
cout << "Le nombre " << x << " a pour racine carree : " << racx << "\n" ;
}
}
cout << "Travail termine - au revoir " ;
}
Variables
Une variable est caractérisée par :
– son nom : mot compos´e de lettres ou chiffres, commençant par une lettre (le caractère tient
lieu de lettre),
– son type précisant la nature de cette variable (nombre entier, caractère, objet etc.),
– sa valeur qui peut être modifiée `à tout instant.
Durant l’exécution d’un programme, `à toute variable est attachée une adresse : nombre entier
qui indique ou se trouve stockée en mémoire la valeur de cette variable.
a) vide : void . Aucune variable ne peut être de ce type. On en verra l’usage au paragraphe
suivant
b) entiers, par taille-mémoire croissante :
• char, stocké sur un octet ; valeurs : de −27 `a 27 − 1 (−128 `a 127),
• short, stocké sur 2 octets ; valeurs : de −215 `a 215 − 1 (−32768 `a 32767),
• long, stocké sur 4 octets ; valeurs : de −231 `a 231 − 1,
• int, coïncide avec short ou long, selon l’installation.
c) réels, par taille-mémoire croissante :
• float, stocké sur 4 octets ; précision : environ 7 chiffres,
• double, stocké sur 8 octets ; précision : environ 15 chiffres,
• long double, stocké sur 10 octets ; précision : environ 18 chiffres.
On trouve parfois le mot unsigned précédant le nom d’un type entier (on parle alors
d’entier non signé ; un tel entier est toujours positif).
Déclaration des variables
En C++, toute variable doit être déclarée avant d’ être utilisée.
Forme générale d’une déclaration : <type> <liste de variables>;
ou :
<type> est un nom de type ou de classe,
<liste de variables> est un ou plusieurs noms de variables, séparés par des virgules.
Exemples :
int i, j, k; // déclare trois entiers i, j, k
float x, y; // déclare deux réels x, y
Initialisation et constantes
9 Il est possible d’initialiser une variable lors de sa déclaration comme dans : int n = 15 ;
9 Il est cependant possible de déclarer que la valeur d’une variable ne doit pas changer
lors de l’exécution du programme. Par exemple, avec : const int n = 20 ;
9 Ou bien utiliser définition d'un symbole à l'aide de la directive de compilation
#define exemple : #define PI = 3.14159
9 En C++ on peut faire « Initialisation à la mode objet » : int i(0) ; long j(123456789);
Le type bool
Ce type est tout naturellement formé de deux valeurs notées true et false. Il peut intervenir
dans des constructions telles que :
Exemple1
bool ok = false ;
.....
if (.....) ok = true ;
.....
if (ok) .....
Exemple2
bool adulte(true);
if (adulte)
{
cout << "Vous etes un adulte !" << endl;
}
Le type String
String a;
a = "darties"; // initialisation
cout << a << endl; // affichage
cout << a.length() << endl; // obtention de la taille
cout << a.at(4) << endl; // obtention du 4eme caractère
ou
Expressions
Définition
En combinant des noms de variables, des opérateurs, des parenthèses et des appels de
fonctions on obtient des expressions.
Une règle simple à retenir :
En C++, on appelle expression tout ce qui a une valeur.
7 LES OPERATEURS
Associativité
L’associativité désigne la direction dans laquelle sont exécutés les opérateurs d’un même
niveau de priorité. Exemple, la multiplication et la division ont les mêmes niveaux de priorité
et leur associativité est de gauche à droite :
int a = 3*4/2*3; // a = 18 !
int b = 3*4/(2*3); // a = 2 !
De manière générale, l’ajout de parenthèse enlève les ambiguïtés d’associativité et de
priorité
Exemples :
19.0 / 5.0 vaut 3.8
19 / 5 vaut 3,
19 % 5 vaut 4.
INCREMENTATION – DECREMENTATION
OPERATEURS COMBINES
Exemple
Le langage C++ permet d'effectuer automatiquement des conversions de type sur les scalaires:
int -> long -> float -> double -> long double
Exemple
int i; float x;
Alors, si i vaut 3, l’expression x = i donne à x la valeur 3.0 (conversion entier → réel).
Inversement, si x vaut 4.21, l’expression i = x donne à i la valeur 4, partie entière de x
(conversion réel → entier).
Une conversion de type float --> int ou char peut-être dégradante.
Une conversion de type int ou char --> float est dite non dégradante.
Remarque
Les opérateurs arithmétiques ne sont théoriquement pas définis pour le type short (bien qu’il
s’agisse d’un vrai type numérique), ni pour les types char et bool qui peuvent cependant
apparaître, eux aussi, dans des expressions arithmétiques.
En fait, C++ prévoit tout simplement que toute valeur de l’un de ces trois types apparaissant
dans une expression est d’abord convertie en int. On parle alors, dans ce cas, de «
promotions numériques » (ou encore de « conversions systématiques »).
Exemple :
1.
n=3;
x=3.5;
p=2;
cout<< n * p + x ; donne 9.5 Alors si on force l’affichage cout<<int(n*p+x) donne 9
2.
p1=2;
p2=3;
p3=4;
x=2.9;
3.
Si p1, p2 et p3 sont de type short et x de type float, l’expression :
L’opérateur de cast
Le programmeur peut forcer la conversion d’une expression quelconque dans un type de son
choix, à l’aide d’un opérateur un peu particulier nommé en anglais "cast".
(double) ( n/p ) aura comme valeur celle de l’expression entière n/p convertie en double.
Le résultat de la comparaison est une valeur booléenne prenant l’une des deux valeurs true ou
false.
En ce qui concerne leur priorité, il faut savoir que les quatre premiers opérateurs (<, <=, > et
>=) sont de même priorité. Les deux derniers (== et !=) possèdent également la même
priorité, mais celle-ci est inférieure à celle des précédents. Ainsi, l’expression :
a < b == c < d est interprétée comme : ( a < b) == (c < d)
Les opérateurs logiques
&& (and) || (or), !(not)
L’opérateur conditionnel
max = a>b ? a : b
Exercices
int n = 10 , p = 4 ;
long q = 2 ;
float x = 1.75 ;
Donner le type et la valeur de chacune des expressions suivantes :
a) n + q long(12)
b) n + x float 11,75
c) n % p +q long(4)
d) n < p int (0)
e) n >= p int(1)
f) n > q int(1)
g) q + 3 * (n > p) long(5)
h) q && n int(1)
i) (q-2) && (n-10) int(0)
j) x * (q==2) float(1.75)
k) x *(q=5) float(8 .75)
10 Espaces de noms
Utilisation d’espaces de noms (namespace) lors de l’utilisation de nombreuses bibliothèques
pour éviter les conflits de noms
Il est possible d’importer un espace de nom. Permet d’utiliser les identificateurs de cet espace
sans préfixe.
Exemple
using namespace std;
Ex. Si la fonction MaFonction() est définie dans l’espace de noms MonEspace, l’appel de la
fonction se fait par MonEspace::MaFonction()
Pour être parfaitement correct :
std::cin
std::cout
std::endl
Ä using namespace std; // pour toutes les fonctions
Directives de préprocesseur
#include <iostream> : iostream signifie « Input Output Stream », ce qui veut dire « Flux
d'entrée-sortie ».
C'est ce qu'on appelle une directive de préprocesseur. Son rôle est de « charger » des
fonctionnalités du C++ pour que nous puissions effectuer certaines actions.