Programmation en Langage C++
Mohamed EL HADDAD
Département
Systèmes d'Information et de Communication
1
Particularités du C++ par rapport à C
C++ présente par rapport au C ANSI, des extensions qui ne sont
pas véritablement orientées objets.
En voici un bref résumé:
Nouvelle forme de commentaire
Plus grande liberté dans l'emplacement des déclarations
Notion de référence ( Transmission d'arguments par adresse )
Surdéfinition des fonctions
Nouveaux opérateurs de gestion dynamique de la mémoire
Les fonctions " en ligne " (inline )
2
Commentaires
En C++, les commentaires s'écrivent derrière un // et se terminent avec la fin
de la ligne
Déclaration des variables
En C++, on peut déclarer les variables locales si besoin il y a. Si cette variable est
déclarée au début d'un bloc, sa portée est limitée à ce bloc.
Exemple:
int main()
{
for (int i=5; i<=0;i--) // i est connue de toute la fonction main
{
int j; // j n'est connue que du bloc
……;
}
}
Fonctions d'entrées/ Sorties
En C++, on peut utiliser toutes les fonctions d'entrées/sorties du C ( printf, puts,
scanf, …) sans oublier d'inclure le fichier d'en tête " stdio.h"
D'autres possibilités existent en C++, à condition de déclarer le fichier d'en tête "
iostream.h ".
Pas nécessaire de spécifier des formats.
L'affichage à l'écran se fait à l'aide de l'opérateur cout
La saisie se fait grâce à l'opérateur cin 3
Exemple:
#include <conio.h>
void main()
{int n=25;
char *tc = "On essaie cout !";
float x = 3.1456;
cout<<"Salut tt le monde \n";
cout<< tc <<"\n";
cout<<" Salut tt le monde \n"<<tc<<"\n";
cout<<"n= "<<n<<" x= "<<x<<"\n";
cout<<"Saisir un entier: ";
cin >> n; // équivalent à scanf("%d",&n);
cout << " n= "<<n;
int a, b;
cin >> a >> b; // saisie de 2 entiers séparés par un Retour Chariot
cout << " a= " <<a << "b= "<<b;
}
Remarque: Les notations ci-dessus seront justifiées prochainement
Conversions de type
Le langage C++ autorise les conversions de type entre variables de type char, int,
float, double.
Une conversion de type float int ou char est dite dégradante
Une conversion de type int ou char float est dite non dégradante
4
Conversions de type lors d'appel à fonction
Le C++, contrairement au C, autorise dans une certaine mesure, le non
respect du type des arguments lors d'un appel à fonction.
Le compilateur opère alors une conversion de type.
Exemple:
double fct( int x, float y)
{
Corps de la fonction
}
void main() {
char ch;
int i,j;
float r;
double a,b,c,d;
a=fct(i,r); // appel standard
b=fct(ch,r); // appel correct, ch est converti en int
c=fct(i,j); // appel correct, j est converti en float
d=fct(r,j); // appel correct, r est converti en int et j en float
}
5
Les arguments par défaut
En C, il est indispensable que l'appel d'une fonction
contienne autant d'arguments que la fonction en attend
effectivement.
C++ permet de s'affranchir en partie de cette règle.
En C++, on peut préciser la valeur prise par défaut par un
argument de fonction. Lors de l'appel à cette fonction,
si on oublie l'argument, il fait comme si l'appel avait
été effectué avec cette valeur, dans le cas contraire,
celle si est ignorée.
6
Les arguments dont la valeur est fournie par défaut doivent se situer en
fin de liste. Situation interdite
int fct(int n=2, float m, double x=2.5)
Exemple:
#include<iostream.h>
void main(){
int n=10, p=20;
void f(int , int=12); // prototype avec une valeur par défaut
void g(int=0 , int=12); // prototype avec deux valeurs par défaut
f(n,p); // appel normal
f(n); // appel avec un seul argument
// f() serait, ici, rejeté
g(n,p); // appel normal
g(n); // appel avec un seul argument
g(); // appel sans argument autorisé, ici
}
voif f(int a, int b) //en tête habituelle
{
……………….
}
voif g(int a, int b)
{
……………….
}
Exercice:
Ecrire la fonction puissance, par défaut, la fonction devra fournir x3
7
Surdéfinition de fonctions
Surdéfinition : Un même symbole qui possède plusieurs
significations différentes, le choix de l'une de
significations se faisant en fonction du contexte.
L'un des atouts de C++ est de permettre la surdéfintion
de la plupart des opérateurs (A voir plus tard).
C++ autorise la définition de fonctions différentes et
portant le même nom. Le choix de la bonne fonction est
basé sur le type des arguments.
8
Exemple:
#include <iostream.h>
void test(int n = 0,float x = 2.5) {
cout <<"Fonction N°1 : ";
cout << "n= "<<n<<" x="<<x<<"\n";
}
void test(float x = 4.1,int n = 2) {
cout <<"Fonction N°2 : ";
cout << "n= "<<n<<" x="<<x<<"\n";
}
int main() {
int i ; float r ;
Cout << "saisir un réel " ; cin >> r ;
Cout << "saisir un entier "; cin >> i ;
test(i,r); // fonction N°1
test(r,i); // fonction N°2
test(i); // fonction N°1
test(r); // fonction N°2
return 0;}
Remarque:
Les appels suivants, ambigus, sont rejetés par le compilateur
test() test (i,i) et test (r,r)
9
Exercice:
Ecrire une fonction void affiche(float x, int n=0) qui affiche xn.
Ecrire une autre fonction void affiche(int n, float x=0) qui affiche
xn .
Les mettre en œuvre dans le programme principal, en utilisant la
propriété de surdéfinition.
Remarque:
Cet exemple conduit à une erreur de compilation lors d'appel de type
mn avec m et n entiers.
10
Opérateurs new et delete
En C, la gestion dynamique de mémoire se fait à l'aide des fonctions malloc et
free . Dans la P.O.O, C++ a introduit deux nouveaux opérateurs new et delete
adaptés à la gestion dynamique d'objets ( notion d'objet à voir plus tard).
Syntaxe de new :
new type où type est un type quelconque
new type[n] alloue l'emplacement nécessaire pour n (entier) éléments du
type indiqué
Syntaxe de delete : delete adresse
Exemple:
int *pentier ; // déclaration d'un pointeur sur un entier
pentier = new int ; // allocation de place en mémoire pour un entier
delete pentier ; // libération de la mémoire
Aussi on peut déclarer ainsi: int *pentier = new int ;
char *pch ;
pch = new char[50] ; // réservation de place en mémoire pour 50 "char "
delete pch ; // libération de la mémoire
Ou encore char *pch = new char[50] ;
11
Notion de référence
En C, la notation &n signifie " adresse de la variable n «
En C++, cette notation possède deux significations :
Il peut toujours s'agir de l'adresse de la variable n
Il peut aussi s'agir de la référence à n
Seul le contexte du programme permet de déterminer s'il
s'agit de l'une ou l'autre des deux significations.
Son principal intérêt est qu'elle permet de laisser le
compilateur mettre en œuvre les " bonnes instructions "
permettant d'assurer effectivement un transfert par
adresse.
Exemple :
int n ;
int &p = n ; // p est une référence à n
// p occupe le même emplacement mémoire que n
n=4 ;
12
Transmission par référence en C++
En C, comme en C++, un sous programme ne peut modifier la valeur d'une
variable locale passée en argument de fonction. Pour se faire en C, il faut
passer l'adresse la variable ( Notion de pointeur ).
C++ permet de demander au compilateur de prendre lui même en charge la
transmission des arguments par adresse: On parle en général, dans ce cas,
de transmission par référence.
Exemple 1 :
Passage par valeur ( L’échange n’aura pas lieu )
#include <iostream.h>
#include <conio.h>
void echange(int a,int b) {
int aux;
aux = b; b = a; a = aux;
cout<<"Pendant l'échange: a = "<<a<<" b = "<<b<<"\n"; }
void main() {
int u=5,v=3;
cout<<"Avant echange: u = "<<u<<" v = "<<v<<"\n";
echange(u,v);
cout<<"Apres echange: u = "<<u<<" v = "<<v<<"\n";
getch() ;
} 13
Exemple 2 :
Passage par adresse ( L’échange aura lieu)
#include <iostream.h>
#include <conio.h>
void echange(int *a,int *b)
{
int aux; aux = *b; *b = *a; *a = aux;
cout<<"Pendant l'échange: a = "<<*a<<" b = "<<*b<<"\n";
}
void main()
{
int u=5,v=3;
cout<<"Avant echange: u = "<<u<<" v = "<<v<<"\n";
echange(&u,&v);
cout<<"Apres echange: u = "<<u<<" v = "<<v<<"\n";
getch() ;
}
14
Exemple 2 :
En C++, on préférera le passage par référence
#include <iostream.h>
#include <conio.h>
void echange(int &a,int &b) // référence à a et b
{
int aux; aux = b; b = a; a = aux;
cout<<"Pendant l'échange: a = "<<a<<" b = "<<b<<"\n";
}
void main()
{ int u=5,v=3;
cout<<"Avant echange: u = "<<u<<" v = "<<v<<"\n";
echange(u,v);
cout<<"Apres echange: u = "<<u<<" v = "<<v<<"\n";
getch() ;}
L’échange a lieu. Le compilateur prend en charge le passage par adresse si
celui-ci est nécessaire.
Remarquer la simplification de l’écriture de la fonction.
15