Documente Academic
Documente Profesional
Documente Cultură
2010-2011
c
2
Table des matières
1 Introduction 5
3
4
Chapitre 1
Introduction
Le langage C++ a été conçu à partir de 1982 par Bjarne Stroustrup (AT&T Bell
Laboatories). L’idée est d’ajouter au langage C des classes analogues à celles du langage
Simula. Il s’agissait de greffer sur un langage classique des possibilités de Programmation
Orientée Objet.
Les extensions de C++ par rapport au C ANSI ne sont pas toutes véritablement
liées à la P.O.O. En fait, nous pourrions caractériser C++ par cette formule : C + + =
C ±E+S+P
– C désigne le C norme ANSI.
– E représente les écarts de C++ par rapport à la norme ANSI de C.
– S représente les spécifités de C++ qui ne sont pas véritablement axées sur la P.O.O.
– P représente les possibilités de P.O.O.
Les principaux écarts concernent essentiellement (cf. Chap. 2) :
– les définitions de fonctions : en-têtes, prototypes, arguments et valeur de retour,
– la portée du qualificatif const,
– les compatibilités entre pointeurs.
Bref résumé des spécifités de C++ (voir Chap. 4) :
– nouvelle forme de commentaire (en fin de ligne),
– plus grande liberté dans l’emplacement des déclarations,
– notion de référence facilitant la mise en oeuvre de la transmission d’arguments par
adresse,
– surdéfinition de fonctions : attribution d’un même nom à différentes fonctions, la
reconnaissance de la fonction réellement appelée se faisant d’après le type et le
nombre des arguments figurant dans l’appel (on parle parfois de signature),
– nouveau opérateur de gestion dynamique de la mémoire : new et delete,
– possibilité de définir des fonctions en ligne (inline), ce qui accroı̂t la vitesse
d’exéction.
5
6
Chapitre 2
Example :
/* ----fonction.cpp-----*/
int somme(int i, int j) {
return i+j ;
}
/* ------ fonction.h-------*/
int somme(int, int) ;
/* Programme principal */
/* ------ fonction.h-------*/
#include<stdio.h>
#include"fontions.h"
main() {
int a=2, b=3 int c ;
c=somme(a,b) ;
printf("somme=%d ",c) ;
return 0 ;
}
7
8
En C++ comme en C ANSI, les arguments d’une fonction ainsi que la valeur de retour
peuvent :
– ne pas exister,
– être une valeur scalaire d’un des types de base,
– être une valeur de type structure.
Remarques :
– il est possible de transmettre la valeur d’une structure, aussi bien en argument qu’en
valeur de retour,
– il n’est pas possible de faire de même avec les tableaux.
Différences C et C++
Ces différences portent uniquement sur la syntaxe des en-têtes et des prototypes des
fonctions à savoir :
1- Fonctions sans arguments : Pour déclarer ou définir une fonction sans arguemnts, en
CANSI, on utilise float fonction(void) ; . En C++, on utilise float fonction() ;
2- Fonctions sans valeur de retour : En C ANSI, on peut employer le mot void pour
définir (en-tête) ou déclarer (prototype) une fonction sans arguments. En C++, on doit
absolument le faire.
La norme C ANSI a introduit le qualificatif const qui permet d’indiquer qu’une valeur
ne change pas directement. Le même qualificatif est utilisé par C++ pour définir des
entités constantes. Des exemples typiques d’utilisations de cette fonctionnalité pour des
variables sont (Cf. ) :
– la représentation des bornes de boucles. C’est le cas de variable taille qui ne doit
pas être modifiée une fois qu’il est fixée ;
– le passage de paramètres dans des fonctions qui ne sont pas sensées modifier la valeur
de ces paramètres. C’est le cas de la fonction contient qui effectue une recherche
et qui ne doit pas modifier la valeur des paramètres qui lui sont fournis.
9
int main()
{
const int j; /* Erreur de compilation */
int taille = 1000;
int tab[1000];
bool appartient;
int i;
...
appartient = contient(tab,taille,i);
...
}
Portée
Lorsque const s’applique à une variable globale, C++ limite la portée du symbole au
fichier source contenant la déclaration ; C n’imposait aucune limitation.
En C++, il devient plus facile de remplacer certaines instructions #define par des
déclarations de constantes. Ainsi, là où en C vous procédiez de cette façon :
#define N 8 #define N 3
....... .......
fichier1 fichier2
vous pouvez en, C++, procéder ainsi :
const N = 8 const N = 3
....... .......
fichier1 fichier2
En C, vous auriez obtenu une ereur au moment de l’édition de liens. Vous auriez pu
l’éviter :
– soit en déclarant N static, dans au moins un des deux fichiers (mieux de le faire dans
les deux) :
static const int N = 8 ; static const int N = 3 ;
– soit, si N avait eu la même valeur dans les deux fichiers, en plaçant dans le second
fichier :
extern const int N ;
Une expression constante est une expression dont la valeur est calculée lors de la
compilation. Ainsi avec const int p = 3 ; l’expression 2*p*5 n’est pas une expression
constante en C alors qu’elle en est une en C++.
10
Pour la déclaration des tableaux, le compilateur doit connaı̂tre la taille à réserver sur
la pile. Ainsi, les instructions :
const int nel = 15 ;
...
double t1[nel + 1], t2[2*nel][nel] ;
seront acceptées en C++, alors qu’elles étaient refusées en C.
pour la première et
pour la seconde.
En C++, seule la conversion d’un pointeur quelconque en void * peut être implicite
(gen = adi). Cependant, l’opéartion inverse est dangereuse. La conversion de void * en
un pointeur de type donné revient à associer un type à une adresse. Il est généralement
dangereux d’utiliser un pointeur converti en un type différent de celui de l’objet pointé.
Example :
C++ dispose de toutes les routines offertes pae la bibliothèque standard du C ANSI.
Mais il comporte également de nouvelles possibilités d’entrées-sorties reposant sur les no-
tions de flots (ou streams) et de surdéfinition (voir plus loin). Pour pouvoir les utiliser,
il faut inclure l’en-tête <iostream>. Les entrées- sorties sont ensuite réalisées par l’in-
termédiaire des flots suivants :
– cin : flot d’entrée standard (par défaut le clavier) ;
– cout : flot de sortie standard (par défaut l’écran).
11
12
Le langage C++ dispose d’un certain nombre de spécificités qui ne sont pas axées sur
la P.O.O.
4.1 Commentaires
Exemple :
/*
cei est un commentaire de
plusieurs lignes
/
int i =2 ;// Commentaire court (fin de ligne)
En C++, l’emplacement des déclarations est libre. Le programmur n’est pas obligé de
les mettre au début d’une fonction. Par contre, on ne peut utiliser la variable déclarée que
dans les instructions du bloc où est effectuée la déclaration et postérieures à la déclaration.
L’avantage de cette spécificité du C++ est de pouvoir déclarer une variable juste au
moment où l’on en a besoin et cela clarifie le programme.
15
16
void f() {
...
i = 8; //incorrect
...
int i; //i est declare ici
...
i = 8; // correct
...
{
...
float f; // f est declare ici
...
f = 4.0; //correct
...
} // fin de la portee de f
f = 4.0; // incorrect
...
i = 5; // correct
...
}// fin de la portee de i
int n;
int & p = n;
La seconde signifie que p est une référence à la variable n. Ainsi, dans la suite, n et p
désigneront le même emplacement mémoire. Par exemple, avec :
n = 3;
cout << p;
En C ANSI, il est indispensable que l’appel d’une fonction contienne autant d’ar-
guments que la fonction en attend effectivement. C++ permet de s’affranchir de cette
contrainte en permettant l’attribution de valeurs par défaut à des arguments.
18
Dans une fonction, les derniers arguments peuvent prendre des ”valeurs par défaut”.
Déclaration :
float f(char, int = 10, char* = "Tout") ;
Appels :
f(c, n, "rien");
f(c, n); // <-> f(c, n, "Tout")
f(c); // <-> f(c,10, "Tout")
f(); // erreur
Seuls les derniers arguments peuvent avoir des valeurs par défaut.
float f(char = ’a’, int, char* = "Tout") ; // erreur
#include<iostream>
using namespace std;
float max(float,float);
float max(float,float,float);
float max(int,float[]);
void main()
{
float x,y,z;
float T[]={11.1f,22.2f,33.3f,44.4f,7.7f,8.8f};
19
x=max(1.86f,3.14f);
y=max(1.86f,3.14f,37.2f);
z=max(6,T);
cout<<x<<" "<<y<<" "<<z<<endl;
}
Résultats :
3.14 37.2 44.4
L’analyse de la signature déetermine la fonction à utiliser. Les promotions et conver-
sions usuelles s’appliquent.Le type de retour n’intervient pas
float min(int,float);
double min(int,float); //erreur
On peut aussi surcharger les opérateurs : définir par exemple l’addition de nombres com-
plexes et représenter cette addition par le signe +.
Exemple 1 :
Exemple 2 :
Exemple 3 :
#include<stdlib.h>
main()
{
int *pi = malloc(sizeof(int));
int *tab = malloc(sizeof(int)*10);
void main ()
{
int *pi = new int;
int *tab = new int[10];
delete tab;
}
}
int a = 2;
int b = carre(a);
cout<<"a = "<<a<<" b = "<<b<<endl;