Vous êtes sur la page 1sur 16

 

Chapitre 1. Introduction à la
programmation orientée objets
(POO)


Mme MECHID Page 1


 
 

1 Présentation du langage C++


Le langage C++ a été conçu à partir de 1982 par Bjarne Stroustrup (AT&T Bell Laboratories),
dès 1982, comme une extension du langage C, lui-même créé dès 1972 par Denis Ritchie,
formalisé par Kerninghan et Ritchie en 1978. L’objectif principal de B. Stroustrup était
d’ajouter des classes au langage C et donc, en quelque sorte, de « greffer » sur un langage de
programmation procédurale classique des possibilités de « programmation orientée objet »
(en abrégé P.O.O.).
Après 1982, les deux langages C et C++ ont continué d’évoluer parallèlement. C a été
normalisé par l’ANSI en 1990. C++ a connu plusieurs versions, jusqu’à sa normalisation par
l’ANSI en 1998.

2 Programmation structurée et programmation orientée objet

Objectifs de la programmation

‰ L’exactitude : Les résultats fournis doivent correspondre aux spécifications) ;


‰ La robustesse : aptitude à bien réagir lorsque l’on s’écarte des conditions normales
d’utilisation ;
‰ l’extensibilité : facilité aux évolutions des spécifications en utilisant aussi des
fonctions génériques plutôt que spécifiques.
‰ la réutilisabilité : possibilité d’utiliser certaines parties du logiciel ;
‰ la portabilité : facilité avec laquelle on peut exploiter un même logiciel dans
différentes implémentations ;
‰ l’efficience : temps d’exécution, taille mémoire...

La programmation structurée

En programmation structurée, un programme est formé de la réunion de différentes


procédures et de différentes structures de données, généralement indépendantes de ces
procédures.

Programmes = algorithmes + structures de données

Donc la programmation structurée décompose une tâche en termes de sous-programmes en


analysant le problème de manière descendante ("Top-Down").

Mme MECHID Page 2


 
 

En pratique, l’adaptation ou la réutilisation d’un logiciel conduisait souvent à « casser » le


module intéressant, et ceci parce qu’il était nécessaire de remettre en cause une structure
de données.

3 La programmation orientée objet

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. :

Objet= Méthodes + 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

4 C++ et la programmation structurée


Les possibilités de programmation structurée de C++ sont en fait celles du langage C
On trouve :
Les types numériques, le type caractère, les tableaux, les structures de contrôle, les pointeurs,
Les conversions de type, Les fonctions et le passage de paramètres,
C++ et la POO
C’est l’apport de C++ au langage C.

„ C++ dispose de la notion de classe (généralisation de la notion de type défini par


l’utilisateur).

Une classe comportera :


Ä la description d’une structure de données
Ä des méthodes.

„ C++ permet l’encapsulation des données, mais il ne l’impose pas


„ C++ permet de définir ce que l’on nomme des « constructeurs » de classe (exécutée au
moment de la création ’un objet ) et même des « destructeurs » (exécutée au moment de la
destruction d’un objet )

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

Quelques critiques sur la P.O.O.


„ Impossible de prévoir toutes les actions possibles que l'on peut avoir à effectuer
sur un objet

Mme MECHID Page 4


 
 

Solution: les sous-classes.


„ Comment choisir les classes?
Il dépend de l'application en question (ou du domaine). Ce choix ne peut être
réalisé qu'à partir d'une étude approfondie de ce domaine.

5 Environnement de développement intégré


Le développement d’un programme passe par trois phases successives :
1) ´écriture et enregistrement des différents fichiers-source,
2) compilation séparée des fichiers .cpp, chacun d’eux donnant un fichier-objet portant le
même nom, mais avec l’extension .obj,
3) lien des fichiers-objets (assurée par un programme appelé linker) pour produire un unique
fichier-exécutable, portant l’extension .exe ; ce dernier pourra être lancé et exécuté
directement depuis le système d’exploitation.
Ce développement est grandement facilite lorsqu’on travaille dans un environnement de
développement intégré (en abrégé : EDI), qui gère l’ensemble des fichiers et tâches à effectuer
sous la forme d’un projet.

Mme MECHID Page 5


 
 

6 Généralités sur le langage C++

Alors commençons par un exemple :

Voici le programme suivant :

#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.

H Les types de base de C++

Mme MECHID Page 6


 
 

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);

Mme MECHID Page 7


 
 

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

char nom[dim]; ou bien char *nom=new char[dim];

Exemple: char texte[20]; ou bien char *texte=new char[20];

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.

Mme MECHID Page 8


 
 

7 LES OPERATEURS

Opérateur unaire, binaire et ternaire


Un opérateur qui ne possède qu’un seul opérande est dit unaire. Par exemple, l’opérateur &
est un opérateur unaire :
int a ;
&a ; // l’adresse mémoire où est stocké a
Un opérateur binaire possède deux opérandes (à ne pas confondre avec les opérateurs réalisant
des opérations en binaire…).
exemple
int a ;
a = 1 ; // = est un opérateur binaire
on peut avoir aussi :
9 Opérateurs arithmétiques sur les réels: + - * / avec la hiérarchie habituelle.
9 Opérateurs arithmétiques sur les entiers: + - * / (quotient de la division) % (reste de la
division) avec la hiérarchie habituelle.

Il existe un seul opérateur ternaire : l’opérateur de condition « ?: ».

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é

a + b + c + d // G : associativité à gauche ((a + b) + c) + d


x = y = z = t // D : associativité à droite x = (y = (z = t))

Exemples :
19.0 / 5.0 vaut 3.8

Mme MECHID Page 9


 
 

19 / 5 vaut 3,
19 % 5 vaut 4.

9 L'opérateur sizeof(type) renvoie le nombre d'octets réservés en mémoire pour chaque


type d'objet. Exemple: n = sizeof(char);

INCREMENTATION – DECREMENTATION

i = i+1; est équivalent à i++;


i = i-1; est équivalent à i--;

OPERATEURS COMBINES

a = a+b; est équivalent à a+= b;


a = a-b; est équivalent à a-= b;
a = a & b; est équivalent à a&= b;

Forme générale de l’expression d’affectation : <variable> = <expression>

Exemple

int a, b=3, c, d=3;

a=++b; // équivalent à b++; puis a=b; => a=b=4

c=d++; // équivalent à c=d; puis d++; => c=3 et d=4

8 LES CONVERSIONS DE TYPES

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.

Mme MECHID Page 10


 
 

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 int, p de type long et x de type float, l’expression :


n * p + x fournit un résultat de type float

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, p2 et p3 sont de type short et x de type float, l’expression :


p1 * p2 + p3 * x

p1=2;

p2=3;

p3=4;

x=2.9;

cout<< p1 * p2 + p3 * x ; donne 17.6

3.
Si p1, p2 et p3 sont de type short et x de type float, l’expression :

p1 * p2 + p3 * x est évaluée comme suit :

Mme MECHID Page 11


 
 

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".

Exemple : si n et p sont des variables entières, l’expression :

(double) ( n/p ) aura comme valeur celle de l’expression entière n/p convertie en double.

Les opérateurs relationnels

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)

Mme MECHID Page 12


 
 

L’opérateur conditionnel

Considérons l’instruction suivante :


if ( a>b )
max = a ;
else
max = b ;

En C++, il est possible, grâce à l’aide de l’opérateur conditionnel, de traduire presque


littéralement la phrase ci-dessus de la manière suivante :

max = a>b ? a : b

Alors sa syntaxe est la suivante : condition ? expression-1 : expression-2


Cette expression est égale à expression-1 si condition est satisfaite, et `a expression-2
sinon

Mme MECHID Page 13


 
 

Récapitulatif des priorités de tous les opérateurs

Exercices

Soit les déclarations suivantes :

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)

Mme MECHID Page 14


 
 

j) x * (q==2) float(1.75)
k) x *(q=5) float(8 .75)

9 Lire et écrire des informations

H Pour lire des informations : utiliser le flot cin


cin >> var1 >> … >> varn
Instruction affectant aux variables var1, var2, etc. les valeurs lues (au clavier)

L’opérateur cin, spécifique à C++, appartient à la bibliothèque iostream.h, et permet la


saisie à partir du clavier de n'importe quel type de variable (l’affichage prend en compte
le type de la variable).
Tous les éléments saisis après un caractère d'espacement (espace, tabulation) sont
ignorés.

H Pour écrire des informations : utiliser le flot cout


Entrées/sorties fournies à travers la librairie iostream
cout << expr1 << … << exprn
Instruction affichant expr1 puis expr2, etc.
cin : « flot d’entrée » associée à l’entrée standard (stdin)

10 Espaces de noms
Utilisation d’espaces de noms (namespace) lors de l’utilisation de nombreuses bibliothèques
pour éviter les conflits de noms

Espace de noms : association d’un nom à un ensemble de variable, types ou fonctions

Il est possible d’importer un espace de nom. Permet d’utiliser les identificateurs de cet espace
sans préfixe.

Mme MECHID Page 15


 
 

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.

Mme MECHID Page 16


 

Vous aimerez peut-être aussi