Vous êtes sur la page 1sur 46

Programmation Orientée

Objets
Chapitre 2
Améliorations non objets de C++
par rapport au langage C

Pr. Saïd OUATIK EL ALAOUI


s_ouatik@yahoo.com
ouatikelalaoui.said@uit.ac.ma
Plan
 Introduction

 Ecarts de C++ par rapport à C ANSI


 Fonctions et constantes

 Apports non objets de C++


 Commentaires
 Nouvelles primitives : d’E/S cin, cout
 Déclaration des variables
 Références
 Surdéfinition des fonctions
 Arguments par défaut
 Fonctions en ligne
 Déclaration des structures
 Nouveaux opérateurs new, delete

2011-2012 2
Introduction
 C++ est le C enrichi par les possibilités de la POO
 Evolution de C (C++ signifie incrémentation du C)

 C++ est un langage hybride


 Classique (procédural)
 Orienté Objet

2011-2012 3
Introduction
 C++ = C – E + S +P C++
 C : Norme ANSI de C
 E : Ecarts par rapport à la norme de C
P
 S : Spécificités non objet de C++
S
 P : Possibilités objets de C++
E
C

2011-2012 4
Historique de C++
 C++ a été développé dans les labos AT&T BELL au début des
années 1980 par Bjarne STROUSTRUP

 1979 développement de « C with classes »

 1983/1984 langage C++

 1987 version 1.2 de C++ (début d’une large diffusion)

 1998 norme ISO : standard du C++

2011-2012 5
Ecarts/C norme ANSI

 Définitions des fonctions

 Prototypes des fonctions

 Arguments et valeurs de retour

 Constantes

2011-2012 6
Ecarts / C norme ANSI
 Définitions des fonctions

 En C, il y a deux manières pour définir une fonction :

Forme1 Forme 2
int fonct(u,v) int fonct(int u,int v)
int u; {
int v; …
{ }

}
 En C++ seule la deuxième forme est retenue

2011-2012 7
Ecarts / C norme ANSI
 Prototypes des fonctions en C
 Le prototype est la déclaration d’une fonction qui
sera invoquée avant sa définition

 Le prototype d’une fonction peut :


 Être Omis (cas d’une fonction qui retourne un entier)
 Se restreindre au nom de la fonction et au type de retour
– float fonct();
 Être complet
– float fonct(int, double, float);

2011-2012 8
Ecarts / C norme ANSI
 Prototypes des fonctions en C
 Exemple int produit(a,b)
int a; int b;
#include<stdio.h> {
void main() int r;
{ r=a*b;
void saisie_produit(); return(r);
int a,b,r; }
printf("saisir deux entiers:"); void saisie_produit()
scanf("%d%d",&a,&b); {
r=produit(a,b); int a,b,r;
printf("\n résultat = %d",r); printf("saisir deux entiers:");
saisie_produit(); scanf("%d%d",&a,&b);
} r=a*b;
printf("\n résultat = %d",r);
}
2011-2012 9
Ecarts / C norme ANSI
 Prototypes des fonctions en C++

 Le prototype est obligatoire

 Le prototype doit préciser le type de retour


de la fonction ainsi que le type de chacun
des paramètres

2011-2012 10
Ecarts / C norme ANSI
 Prototypes des fonctions en C++
 Exemple
#include<stdio.h> int produit(int a,int b)
{ int r;
int main() r=a*b;
{ return(r);
int produit(int,int); }
void saisie_produit();
int a,b,r; void saisie_produit()
printf("\nsaisir deux entiers:"); {int a,b,r;
scanf("%d%d",&a,&b); printf("\nsaisir deux entiers:");
r=produit(a,b); scanf("%d%d",&a,&b);
printf("\n résultat = %d",r); r=a*b;
saisie_produit(); printf("\n résultat = %d",r);
} 2011-2012 } 11
Ecarts / C norme ANSI
 Arguments et valeurs de retour

 Fonctions sans arguments


 En C, deux manières :
– float fonct(void);
– float fonct();

 En C++
– float fonct();

2011-2012 12
Ecarts / C norme ANSI

 Arguments et valeurs de retour

 Fonctions sans valeur de retour


 En C, deux manières :
– void fonct(int, char);
– fonct(int, char);

 En C++
– void fonct(int, char);

2011-2012 13
Ecarts / C norme ANSI
 Porté des Constantes

 Constantes locales

 Pas de différence entre C et C++: La porté est


locale au bloc ou à la fonction

 Définir la constante dans un fichier const c =10 ;

2011-2012 14
Ecarts / C norme ANSI
 Porté des Constantes

 Constantes globales en C
 La porté de la constante n’est pas limitée au fichier
qui la contient

– Définir la constante dans un fichier const c =10 ;

– Référencer la constante dans les autres fichiers par extern


const c ;

2011-2012 15
Ecarts / C norme ANSI
 Porté des Constantes
 Constantes globales en C: Exemple
#include<stdio.h>
#include "constglob.h" /* Fichier constglob.h */
int main()
{ const c= 100;
int a=10,b=20;
extern c;
printf(" le résultat est %d",a+b+c);
}

2011-2012 16
Ecarts / C norme ANSI

 Porté des Constantes

 Constantes globales en C++

 La porté d’une constante est limitée au fichier


source qui la contient

2011-2012 17
Ecarts / C norme ANSI

 Porté des Constantes


 Constantes globales en C++ : Exemple
#include<stdio.h>
#include<stdlib.h>
#include "constglob.h"
int main()
{
int a=10,b=20;
extern c; //Erreur
printf(" le résultat est %d",a+b+c);
}

2011-2012 18
Apports non objets de C++
 Commentaires
 Commentaire de C
/* commentaire classique de C
qui s’étend sur plusieurs lignes */

 Commentaire introduit par C++


// commentaire de fin de ligne

2011-2012 19
Apports non objets de C++
 Entrées/Sorties
 En plus des primitives d’E/S définies dans
C, C++ offre deux nouvelles primitives
 cin : flot d’entrée
 cout : flot de sortie

 Caractéristiques
 Simplicité: Pas besoin d’indiquer le format des
variables
 Extensibilité à d’autres types
2011-2012 20
Apports non objets de C++
 Entrées/Sorties : cout
 Permet d’afficher une chaine, la valeur d’une variable
ou la valeur d’une expression
 cout << ’’ une chaine ’’;
 cout << code ; // code est une variable
 cout << 3.14 * r * r ; // Surface d’un cercle

 Permet d’afficher plusieurs objets avec une seule


instruction:
 cout << ’’ surface = ’’ << 3.14 * r * r ;

 endl : mot réservé qui permet le retour à la ligne


 cout << ’’ surface = ’’ << 3.14 * r * r << endl;

2011-2012 21
Apports non objets de C++

 Entrées/Sorties : cout (Exemple)


Instructions Affichage
int x=3; double y =4.5;
cout <<“ valeur de x=“<<x; valeur de x=3; y=4.5
cout<<“; y=“<<y<<endl; x+y=7.5
cout <<“x+y=”<<x+y;

int x=3; double y =4.5; x=3


cout <<“x = “<<x<<“\n”; y=4.5
cout<<“y=“<<y; x+y=7.5
cout <<“\nx+y=”<<x+y;

2011-2012 22
Apports non objets de C++
 Entrées/Sorties : cin
 Permet de saisir la valeur d’une ou plusieurs
variables
 cin >> var1 >> var2>> … >> varn;

 Exemple
#include<iostream>
Using namespace std;
int main()
{
int n; float x; char c;
cout << ’’entrer un entier, un réel ensuite un caractère’’;
cin >> n >> x >> c;
return 0;
2011-2012 } 23
Apports non objets de C++
 Déclaration des variables
 Plus de liberté sur l’endroit de déclaration
 Déclaration n’importe où dans le programme
– Pas forcément au début (cas du langage C)

 Déclaration à l’intérieur des structures de contrôle


– for(int i=0;…), if(int i = random(100)) , while(), switch()

 Portée limitée au bloc où la variable a été définie

2011-2012 24
Apports non objets de C++
 Déclaration des variables
 Exemple
#include <iostream>
int main()
{
int a, b;
cout << "\nsaisir deux entiers:";
cin >> a >> b;
int r,f; // autorisé
r = a + b; f = 1;
for(int i=1;i<r;i++) // autorisé
f=f*i;
cout << "\nfact = " << f;
return 0;
2011-2012 } 25
Apports non objets de C++
 Références

 C’est quoi une référence ?

 Un type qui permet une manipulation plus


facile des adresses

 Une variable de type référence permet de


designer un espace mémoire existant

2011-2012 26
Apports non objets de C++
 Références
 Déclaration
 Une référence doit être toujours initialisée lors
de sa création. Variable
référence
Objet référencé
Type de l’objet type &ref = var;
référencé

int a, b;
int &refa =a;
int &ref ; // erreur

2011-2012 27
Apports non objets de C++
 Références
 Utilité : Une variable de type référence est
utilisée pour:
 désigner une variable existante (alias,
synonyme)

 designer un objet existant en mémoire et qui


n’a pas de nom
int a =5; int t[10]; refa et a représentent le
même espace
Attribue un nom int &refa =a;
au dernier Attribue un nom
élément de t int &premier =t[0]; au premier
int &dernier =t[9]; élément de t
2011-2012 28
Apports non objets de C++
 Références
 Opérations
 Toute opération effectuée sur l’objet référencé
se répercute sur la référence et vice versa
(même espace mémoire)

int a = 5;
int &refa =a;

a++; refa = 6
cout << ’’refa = ’’ << refa;

refa= 0; a = 0;
cout << ’’a = ’’ << a;
2011-2012 29
Apports non objets de C++
 Références
 Passage des paramètres

 En C, le mode de passage de paramètres:


passage par valeur et passage par adresse

 En C++, trois modes : par valeur , passage par


adresse et passage par référence

2011-2012 30
Apports non objets de C++
 Références
 Passage des paramètres par référence
 Le changement d’un paramètre est conservé
après la terminaison de la fonction

 Évite la gestion complexe des pointeurs

 Offre une meilleure lisibilité

2011-2012 31
Apports non objets de C++
 Références
 Passage des paramètres par référence
 Syntaxe de déclaration
type fonct (type & param,…)

 Appel de la fonction fonct(param,…);

2011-2012 32
Apports non objets de C++
 Références
 Passage des paramètres par référence:
Exemple int main()
{
int a=1;
void swap(int &i, int &j) Int b = 2;
{ cout << ’’avant ’’;
int k = i; cout << ’’a = ’’ << a << ’’b = ’’ << b;
i = j; swap(a, b);
j = k; cout << ’’avant ’’;
} cout << ’’a = ’’ << a << ’’b = ’’ << b;
}

2011-2012 33
Apports non objets de C++
 Surdéfinition des fonctions

 Plusieurs fonctions portent le même nom


 Plus de lisibilité : pas besoin de chercher plusieurs identificateurs
pour la même action

 Les fonctions différent dans le contenu selon le


type et/ou le nombre de paramètres

 Sémantiquement les fonctions font la même


action (ex afficher)

 Le compilateur choisit la fonction à invoquer selon


les paramètres effectifs
2011-2012 34
Apports non objets de C++
 Surdéfinition des fonctions: Exemple
#include<stdio.h>
int main()
int produit(int a,int b)
{
{ int r;
int a,b;
r=a*b;
cout << "\nsaisir deux entiers:";
return(r);
cin >> a >> b;
}
int r, f;
int produit(int a, int b, int c)
r=produit(a,b);
{ int r;
cout << "\n résultat = " << r;
r=a*b*c;
r=produit(a,b,r);
return(r);
cout << "\n résultat = " << r;
}
float x=2.4,y=3.5,z;
float produit(float a, float b)
z=produit(x,y);
{ float r;
cout << "\n résultat = " << z;
r=a*b;
return 0;
return(r);
2011-2012 } 35
}
Apports non objets de C++
 Arguments par défaut
 Possibilité de donner des valeurs par défaut à certains
paramètres omis lors de l’appel d’une fonction

prix_ttc(float prixht, float tva=0.2);

prix_ttc(300); // taux de tva par défaut


prix_ttc(300, 0.1); // taux spécial de la tva

 Seuls les derniers paramètres à droite peuvent avoir des


valeurs par défaut
 float fonct( int a=10, int b, int c=5) // faux

2011-2012 36
Apports non objets de C++
 Arguments par défaut: Exemple
#include<stdio.h>
#include<stdlib.h>
using namespace std;
float prix_ttc(float pht, float tva=0.2)
{ float pttc;
pttc = pht*(1+tva);
return(pttc);
}
int main()
{
float p1,p2;

p1=prix_ttc(300); // taux de tva par défaut


p2=prix_ttc(300,0.1); // taux spécial de la tva
cout << "\n" << p1 << "\t"<< p2;
}
2011-2012 37
Apports non objets de C++
 Macros en langage C : Exemple
#include<stdio.h>
#include<stdlib.h>
#define carre(n) n*n
int main()
{
int a=2,b=3,r;

r=carre(a);
printf("\n résultat = %d",r);

r=carre(a+b);
cout << "\n résultat = « << r;
}
2011-2012 38
Apports non objets de C++
 Fonctions en ligne
 Alternative aux macros du préprocesseur

 Moins complexe et évite les sources


d’erreur des macros
 #define carre(n) n*n
 Comment seront interprétés les appels : carre(a+b)
carre(++a) ?

 Vérification et contrôle des types


2011-2012 39
Apports non objets de C++
 Fonctions en ligne
 Syntaxe : Précéder la définition de la fonction par
le mot clé inline #include <iostream>
using namespace std;
inline int carre(int n) { return(n*n); }
int main()
 Exemple {
int a=2,b=3,r;
r=carre(a);
cout << "\n résultat = " << r;
r = carre(++a);
cout << "\n résultat = " << r << " et a= " << a <<
endl;
return 0;
2011-2012 } 40
Apports non objets de C++
 Fonctions en ligne
 Les fonctions en ligne sont insérées dans le code
par le compilateur à l’endroit de leur appel

 Evitent les opérations d’appel et de terminaison des


fonctions

 Sont plus rapides

 Consomment plus d’espace mémoire

 Doivent être, normalement, de petite taille

2011-2012 41
Apports non objets de C++
 Déclaration des structures
 Pas besoin de précéder le nom de la structure par le mot clé
struct après sa définition

 Exemple
struct etudiant {
int CNE;
char nom[20];
char prenom[20];
};
Int main()
{
Etudiant e1;

}
2011-2012 42
Apports non objets de C++
 Opérateurs new, delete

 En plus des primitives de gestion de la mémoire


du langage C (malloc, free,…), C++ offre deux
primitives new et delete

 new : permet d’allouer de la mémoire pour des


objets dynamiques

 delete : permet de libérer l’espace mémoire


alloué par new
2011-2012 43
Apports non objets de C++
 Opérateur new
 Syntaxe
adresse = new type;
ou
adresse = new type[taille];

 Exemple
int *pi, *pti;

pi = new int; // réservation d’un espace pour un entier

pit = new int[10]; // réservation d’un


espace pour un tableau d’entiers
2011-2012 44
Apports non objets de C++
 Opérateur delete
Syntaxe
delete adresse;

Exemple
int *pi, *pti;

pi = new int; // réservation d’un espace pour un entier

delete pi; // libération de l’espace occupé par pi


2011-2012 45
Apports non objets de C++
 Opérateurs new et delete : Exemple
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int *t;
t=new int[10];
for(int i=1;i<10;i++)
t[i] = i*i;
for(int i=1;i<10;i++)
cout<<t[i]<<"\n";
delete t;
2011-2012 } 46

Vous aimerez peut-être aussi