Vous êtes sur la page 1sur 56

Initiation au Langage C++

Année universitaire : 2019/2020


Plan
 Déclarations de variables et Boolien
Entrées/sorties
 pointeurs
 Références
 Fonctions en ligne
 Surcharge des noms de fonctions
Allocation dynamique de mémoire
 Classes
 Surcharge des operateurs
 Héritage
 Modèles (Templates) 2
Déclarations de variables

En C, les déclarations de variables doivent apparaitre au début


d'un bloc.

En C++, au contraire, on peut mettre une déclaration de variables


partout où on peut mettre une instruction.

Cette différence permet de repousser la déclaration d'une variable


jusqu'à l'endroit du programme où l'on dispose d'assez éléments pour
l'initialiser.

3
Déclarations de variables

int main()
{
int s=0;
for(int i=1;i<15;i++)
s=s+i;
return 0;
}

4
Booléens

En plus des types définis par l'utilisateur, C++ possède quelques


types qui manquaient à C, notamment le type booléen et les types
références.

 le type bool comporte deux valeurs : true et false


 le résultat d’une expression logique (&&, ||, …) est de type bool

5
Entrées/sorties

Un programme qui utilise les flux standard d'entrée-sortie doit


comporter la directive :
#include<iostream>
using namespace std

6
Entrées/sorties

Les flux d'entrée-sortie sont représentés dans les programmes par les
trois variables, prédéclarées et préinitialisées, suivantes :
cin, le flux standard d'entrée qui est habituellement associé au
clavier du poste de travail,
cout, le flux standard de sortie qui est habituellement associé à
l'écran du poste de travail,
cerr, le flux standard pour la sortie des messages d'erreur
également associé à l'écran du poste de travail.

7
Entrées/sorties

Pour afficher les données sur la sortie standard on utilise la syntaxe :

cout<<expression_1<<expression_2<<…<<expression_n;

Pour lire les données à partir de l’entrée standard en utilise la syntaxe:


cin>>var_1>>var_2>>var_3>>…>>var_n

8
Entrées/sorties
Exemple:
#include<iostream>
int somme(int a,int b)
{
return a+b;
}
int main()
{
int x,y;
cout<<‘’donne x et y’’;
cin>> x>>y;
cout<<x<<‘+’<<y<<‘=‘<<somme(x,y);
return 0;
}
9
Pointeurs

Un pointeur est une variable contenant l'adresse d'une autre


variable d'un type donné.

Déclaration
typeX * Nom_var;
Nom_var est un pointeur vers typeX
Nom_var contient l’adresse mémoire où est stocké un typeX

10
Pointeurs
L’opérateur &
L’opérateur & permet de trouver l’adresse d’une variable stockée
dans la mémoire.
int a;
int*x;
x=&a;
Alors x contient l’adresse de variable a.
L’opérateur *
si x est un pointeur vers un type, alors *x est la valeur pointée par x
int a=25;
int *x;
x=&a;
alors *x=25.

11
Pointeurs
Tableaux et pointeurs

le nom d'un tableau représente l'adresse de son premier élément

En simplifiant, nous pouvons retenir que le nom d'un tableau est
un pointeur constant sur le premier élément du tableau

&tableau[0] et tableau représente la même adresse.

12
Pointeurs
Tableaux et pointeurs

Si P pointe sur une composante quelconque d'un tableau, alors P+1


pointe sur la composante suivante. Plus généralement :

P+i pointe sur la i-ième composante derrière P et


P-i pointe sur la i-ième composante devant P.

13
Pointeurs

Pointeurs et chaînes de caractères

On peut attribuer l'adresse d'une chaîne de caractères constante à


un pointeur de type char:

Exemple

char *C;
C = "Ceci est une chaîne de caractères constante";

14
Pointeurs

Pointeurs et chaînes de caractères


Il existe une différence importante entre les deux déclarations:
char A[] = "Bonjour !"; /* un tableau */
char *B = "Bonjour !"; /* un pointeur */

A est un tableau : Les caractères de la chaîne peuvent être changés,


mais le nom A va toujours pointer sur la même adresse en mémoire.

B est un pointeur : Le pointeur peut être modifié et pointer sur autre


chose. La chaîne constante peut être lue, copiée ou affichée, mais
pas modifiée.

15
Références

Notion
A côté des pointeurs, les références représentent une autre
manière de manipuler les adresses des objets placés dans la
mémoire.

Si T est un type donné, le type «référence sur T » se note T&.


Exemple :
int x=50;
int & r=x;// r est une référence sur x

16
Références

Notion

Une valeur de type référence est une adresse mais, sauf lors de
son initialisation, toute opération effectuée sur la référence agit sur
l'objet référencé, non sur l'adresse. Il en découle qu'il est obligatoire
d'initialiser une référence lors de sa création.
r=j ne transforme pas r en une référence sur j mais copie la valeur
de j dans i

17
Références

Références paramètres des fonctions

L'utilité principale des références est de permettre de donner aux


fonctions des paramètres modifiables, sans utiliser explicitement les
pointeurs.

void permuter(int &a,int &b)


{
int tmp=a;
a=b;
b=a;
}
18
Références

Références paramètres des fonctions

l’appel de la fonction permuter() se fait de la façon suivante :


int x=5,y=12;
permuter(x,y)
A la fin de l’exécution x sera 12 et y sera 5

19
Références

Fonctions renvoyant une référence


Il est possible d'écrire des fonctions qui renvoient une référence
comme résultat.
Cela leur permet d'être le membre gauche d'une affectation,

Exemple
char*noms[N];int ages[N];
int &age(char*nom)
{
for(int i=0;i<n;i++)
if(strcmp(nom,noms[i])==0)
return ages[i];
}
20
Références

Fonctions renvoyant une référence


Dans ce cas, on peut écrire :
age(‘ENSAT’)=12;

21
Valeurs par défaut des arguments

Les paramètres formels d'une fonction peuvent avoir des valeurs par
défaut. Exemple:
void trier(void*tab,int nbr,int taille=sizeof(void*),bool croissant=true)
donc on peut faire les appel suivant
trier(tab,14);
trier(tab,14,sizeof(int));
trier(tab,14,sizeof(int),false);

22
Surcharge des noms de fonctions

La signature d'une fonction est la suite des types de ses arguments
formels.
Le type du résultat rendu par la fonction ne fait pas partie de sa
signature.

23
Surcharge des noms de fonctions

en C++ des fonctions différentes peuvent avoir le même


nom, à la condition que leurs signatures soient assez différentes pour
que, lors de chaque appel, le nombre et les types des arguments
effectifs permettent de choisir sans ambiguïté la fonction à appeler.
exemple:
int power(int a,int b)
{
//calcule de a^b
}
float power(float a,int b)
{
//calcule de a^b;
}
24
Surcharge des noms de fonctions

float power(float a,float b)


{
//calcule de a^b
}

alors le programmeur n’aura qu’un nom a connaitre « power » et il


écrira dans tous les cas :
c=power(a,b)

et le compilateur se chargeant de choisir la fonction la plus adaptée,


selon les type de a et b,

25
Allocation dynamique de mémoire
Des differences entre C et C++ existent aussi au niveau de
l'allocation et de la restitution dynamique de mémoire.
Les fonctions malloc et free de la bibliothèque standard C sont
disponibles en C++.
Mais il est fortement conseillé de leur préférer les opérateurs new et
delete.
les objets créés à l'aide de new sont initialisés à l'aide des
constructeurs correspondants, ce que ne fait pas malloc.
De même, les objets liberés en utilisant delete sont finalisés en
utilisant le destructeur de la classe correspondante, contrairement à ce
que fait free.

26
Allocation dynamique de mémoire
pour allouer un unique objet on utilise : new type
pour allouer un tableau de n objets on utilise : new type[n]

Dans les deux cas, new renvoie une valeur de type pointeur sur un
type, c'est-à-dire « type * ».
Exemples (on suppose que Point est un type défini par ailleurs) :
Point *pnt=new Point //un objet Point
int *tab=new int[15]; //un tableau de 15 éléments

27
Allocation dynamique de mémoire
L'opérateur delete restitue la mémoire dynamique. Si la valeur de ptr
a été obtenue par un appel de new, on écrit
delete ptr
dans le cas d’un objet qui n’est pas un tableau.
et
delete[] ptr
dans le cas d’un pointeur vers un tableau d’objets.

28
Exemples
1. Ecrire un programme pour lire et afficher une chaîne de caractère.
2. Ecrire une fonction pour calculer le nombre de caractères dans
une chaîne de caractère.
3. Allouer dynamiquement un tableau de chaînes de caractères puis
le remplir.
4. Allouer dynamiquement une matrice d’entiers puis le remplir.

29
Exemples
Soit la structure suivant :
typedef struct _exmple
{
int nbr_element;
int * element;
}Exemple;
1. Ecrire une fonction pour initialiser une structure de type exemple.
2. Ecrire une fonction pour ajouter un élément au tableau
« element » de la structure « Exemple » .
3. Ecrire une fonction pour supprimer un élément du tableau
« element » de la structure « Exemple ».
4. Ecrire une fonction pour trier les elements du tableau « element »
5. Ecrire une fonction pour afficher les éléments de la structure.
30
Fonction en ligne
Un appel de fonction est une rupture de séquence : à l'endroit où un
appel figure, la machine cesse d'exécuter séquentiellement les
instructions en cours ; les arguments de l'appel sont disposés sur la
pile d'exécution et l'exécution continue ailleurs, là où se trouve le
code de la fonction.
Une fonction en ligne est le contraire de cela : là où l'appel d'une
telle fonction apparait il n'y a pas de rupture de séquence. Au lieu de
cela, le compilateur remplace l'appel de la fonction par le corps de
celle-ci.

31
Fonction en ligne
En C++ on indique qu'une fonction doit être traitée en ligne en
faisant précéder sa déclaration par le mot inline.
inline int abs(int x)
{
return x>0?x:-x;
}
Lorsqu’une fonction est inline sa définition doit figurer dans un
fichier .h et non dans un .cpp.

32
Qu’est ce que POO?

 Programmation Orientée Objet (POO) : paradigme de


programmation informatique.
o Elaborer par Alan Kay dans les années 70s.
o Définition et interactions de briques logicielles 
Objets
 Objet : un concept, une idée ou une entité du monde
physique
o Possède une structure interne et un comportement
Qu’est ce que POO?

 Un objet est caractérisé par :


o Les attributs : Données de l’objet et représente son
état
o Les méthodes : Caractérise son comportement,
l’ensembles d’actions que l’objet peut réaliser.
o Une identité : permet de distinguer l’objet d’une
manière unique indépendamment de son état
Qu’est ce que POO?

 Une classe : La structure d’un objet


o Elle définit son type
o Déclaration de l’ensemble des entités qui
composeront un objet.
o Un objet est une instance ou occurrence d’une
classe, on parle d’instanciation de classe
Classes
Qu’est-ce qu’un attribut d’objet?
Donnée d’un certain type qui est présenté dans chaque objet de la
classe.
Synonymes : « champs », « données membres »
Le type de l’attribut est le même pour toute la classe.
 Les valeurs sont particulières pour chaque objet.

Exemple : « les attributs d’une voiture sont sa masse, sa vitesse


maximale et sa consommation ».

36
Classes
Qu’est-ce qu’une classe?
Vision ensembliste, mathématique: Une classe est un ensemble
d’objets.
Vision informatique : une classe est un type de données.
 Une Classe est un ensemble et un type de données, dont les
éléments sont appelés instances.

37
Classes
Syntaxe C++

La définition d'une classe débute par le mot clé « class »


class nom_classe
{
<listes des attributs>
<listes des méthodes>
};

38
Classes
Syntaxe C++

Exemple:
class Voiture
{
float masse;
int vittesse_max;
float consommation;
void demmarer();
void fermer_porte();
};

39
Classes

Syntaxe C++

Il n’est pas possible de définir un attribut dont le type est celui de


la classe que l’on définit. Il est en revanche possible de définir un
attribut de type pointeur vers la classe en question.

Il n’est pas non plus possible de donner des valeurs par défaut
lors de la définition de la classe.

40
Classes
Syntaxe C++

class Point class Point


{ {
double x, y; double x, y;
int numero; int numero = 0; // ERREUR
}; };

class Point class Point


{ {
double x, y; double x, y;
Point *autre; Point autre; // ERREUR
}; };
41
Classes
Qu’est-ce qu’une méthode d’objet?

Les méthodes d’objet (ou d’instance) sont des fonctions qu’il est
possible d’appliquer à un objet d’une classe.
Synonymes : « fonctions membres » ou simplement « méthodes ».
L’ensemble des méthodes forment la partie comportementale (ou
dynamique) d’un objet.

42
Classes
Méthodes d’objets

On peut procéder de deux manières pour introduire une méthode dans


une classe :
définir la fonction au sein de la définition de la classe elle-même ;
 déclarer la fonction dans la classe, et la définir ailleurs.

43
Classes
Méthodes d’objets

EN GENERAL :
on définit la classe et on déclare ses méthodes dans un fichier dont le
nom est celui de la classe et portant l’extension « .h ».
on définit les méthodes (leur corps) dans un fichier dont le nom est
aussi celui de la classe et portant l’extension « .cpp » qui inclut le
précédent

44
Classes
Organisation des fichiers

Méthode 1: Fichier Point.h


class Point
{
double x, y;
int numero;
void setNumero (int n)
{
numero = n;
}
double norm()
{
return sqrt(x*x + y*y);
}
45
};
Classes
Organisation des fichiers

Méthode 2

Point.h Point.cpp
class Point void Point::setNumero (int n) {
{ numero = n;
double x, y; }
int numero; inline double Point::norm() {
void setNumero (int n); return sqrt (x*x + y*y);
double norm(); }
};

46
Classes
Organisation des fichiers
Lorsque la fonction est définie au sein de la classe, elle est implicitement
mise en ligne ("inline"). Ainsi, dans la méthode 1, les deux méthodes
sont « inline ». Dans la méthode 2, il faut mettre explicitement le
mot-clé inline.

47
Notion d’encapsulation
C’est une bonne pratique de protéger les données des objets pour
respecter le principe de l’encapsulation.
Dans l’esprit le plus pur de l’approche objet, les attributs seront donc
déclarés privés (private), nous verrons plus loin cette notion.
Lors de l’exécution, les attributs de l’objet ne doivent être accessibles
que de l’intérieur de l’objet

48
Spécificateurs d’accès
Les spécificateurs private, protected et public peuvent apparaître dans
un ordre et un nombre quelconque dans la définition d'une classe. Un
spécificateur définit les règles d'accès applicables jusqu'au spécificateur
suivant.

49
Spécificateurs d’accès
class Point
{
private :
double x,y;
int numero;
public :
void setNumero(int num);
protected:
Point*next;
double norm();
public :
void show();
}

50
Spécificateurs d’accès
Si aucun spécificateur n'est précisé :
les membres sont privés (private) par défaut pour une classe (class) ;
ils sont publics (public) par défaut pour une structure (struct).

class Point struct Point


{ {
double x, y; double x, y;
int numero; int numero;
public: void setNumero (int n);
void setNumero (int n); double norm();
double norm(); };
}; Tout est public
3 données privées et 2
méthodes publiques
51
Spécificateurs d’accès
L'accès aux données et fonctions privées d'une classe (private) est
réservé aux méthodes de la classe elle-même, ainsi qu'à des fonctions ou
à des classes étrangères déclarées amies (friend).

Le spécificateur protected a un effet semblable à private, mais avec


une limitation moins sévère des accès. En effet, l'accès est également
autorisé aux méthodes des sous-classes et aux amis de ces sous-classes.

Le spécificateur public signifie que la méthode ou l'attribut est


accessible depuis n'importe quelle autre fonction du programme.

52
Accès aux attributs et méthodes
Point.h
class Point Main.cpp
{ int main() {
public: Point pa;
double x, y; Point *pb = new Point;
int numero; Point tp[3];
void setNumero (int n); pa.x = ...
double norm(); pb->x = ...
void show(); tp[0].x = ...
}; tp->x = ...
... = pa.norm();
... = pb->norm();
... = tp[0].norm();
... = tp->norm();
}
53
Constructeurs et destructeurs
Constructeur

Un constructeur est une méthode spéciale qui est appelée


automatiquement juste après une création d’objet.

Il porte le même nom que la classe.

et n'a pas de type de retour.

Un constructeur sert à initialiser l'objet au moment de sa création

Exemple : classe Point

54
Constructeurs et destructeurs
Constructeur par copie
Un constructeur par copie est un constructeur qui permet d'initialiser un
objet avec un autre objet de la même classe. Il comporte un seul
paramètre : une référence (constante) à un objet de la classe à laquelle il
appartient.
Exemple :
Point(const Point& ptn);
Point p1(10);
Point p2(p1);//constructeur par copie;
Point p3=p1;//Constructeur par copie

55
Constructeurs et destructeurs
Destructeur
Les destructeurs sont les symétriques des constructeurs. On trouve dans
un destructeur des tâches qui sont du domaine du "nettoyage" :
libération de la mémoire allouée dynamiquement ;
enregistrement de données, fermeture de fichiers ...
Le nom du destructeur est le même que celui de la classe, précédé du
signe tilde "~".
 Un destructeur ne possède pas de valeur de retour et n'a aucun
argument.

56