Exood4 Studio - Video Game Development, Toulouse (France)
Exood4 Studios Exood4 Tutorials

   
L a n g a g e   C++

L e   p a s s a g e   d e   C      C + +




 C++ est un sur-ensemble du C tel qu'il est dfini dans la norme ANSI. Ce qui signifie que C++ est compatible avec C : il utilise les types fondamentaux char, int, float, double ... Mais le C++ permet d'aller plus loin pour construire des nouveaux types de donnes et faire de la Programmation Objet en utilisant des types abstraits. Il a t conu pour rendre la programmation plus agrable.


Incompatibilits entre C et C++


1) Dclarations des fonctions

 En C++ toute fonction utilise doit obligatoirement avoir fait l'objet :

  • soit d'une dclaration sous forme de prototype :

    float fct (int,double,char);

  • soit d'une dfinition pralable au sein du fichier source, avec chaque argument prcd de son type :

    float fct (int x, double y, char z)
    {
     ...
    }

    Une fonction sans valeur de retour doit obligatoirement tre de type void.

  • contrairement au C, une fonction C++ qui n'a pas d'argument n'a pas besoin d'avoir void comme paramtre :

    int fct (void); // fonction sans argument en C
    int fct (); // fonction sans argument en C++

2) Les constantes

 La norme C Ansi a introduit le qualificatif const pour dclarer des constantes. On peut galement les simuler en utilisant les macros : #define. Les constates sont des entits part entire. Une constante se dclare de la mme faon qu'une variable initialise mais elle est introduite par le mot rserv const. Il est impossible de modifier le contenu d'une constante.

const float pi = 3.14159;
const char espace = ' ';

 C++ admet galement l'utilisation des constantes. Lorsque const s'applique des variables locales automatiques, aucune diffrence n'existe entre C et C++; la porte tant limite au bloc ou la fonction concerne par la dclaration. Par contre, lorsque const s'applique une variable globale, C++ limite la porte du symbole au fichier source concernant la dclaration (le langage C ne fait aucune limitation).


Remarque :
Les constantes sont souvent utilises en C++ dans le cas o les arguments de fonction sont passs par rfrence alors qu'on ne doit en aucun cas les modifier dans le corps de la fonction.
float moyenne (const int notes[], int nbnotes)
{
 float somme = 0;
 for (int i = 0; i < nbnotes; i++) somme = somme + notes[i];
 return (somme / nbnotes);
}


3) Dfinition d'une structure

 En C, lorsqu'on dfinit une structure, il est ncessaire de rappeler struct pour dclarer des variables de ce type :

struct point
{
 float abscisse;
 float ordonnee;
};

struct point a, b;

 Pour viter le rappel dans une dclaration de variable, on peut introduire une structure par l'intermdiaire d'une dfinition de type en utilisant le qualificatif typedef :

typedef struct point
{
 float abscisse;
 float ordonnee;
};

point a, b;

 En C++ une structure n'a plus besoin d'tre introduite par le qualificatif typedef :

struct point
{
 float abscisse;
 float ordonnee;
};

point a, b;


Spcificits de C++


 C++ dispose, par rapport au C, d'un certain nombre de spcificits qui ne sont pas vritablement axes sur la Programmation Objet.


1) Les entres/sorties

 cin et cout remplacent avantageusement les fonctions printf() et scanf() de la librairie standard d'entres-sorties du C dont les spcifications se trouvent dans le fichier d'en-tte <stdio.h> :
  • cout affiche sur la sortie standard stdout les valeurs des diffrentes expressions, suivant une prsentation adapte leur type.

    cout <<expression1<<expression2<< ... <<expressionN;

  • cin lit sur l'entre standard stdin les diffrentes valeurs et les affecte aux identificateurs de variables prciss dans l'appel.

    cin >>idenfiticateur1>>identificateur2>> ... >>identificateurN;
 Pour pouvoir utiliser cin et cout, il faut inclure le fichier d'en-tte <iostream.h> dans le programme source :

#include <iostream.h>
void main()
{
 int a,b;
 cout << "Entrer deux entiers";
 cin >> a >> b;
 cout << "le produit de " << a << " par " << b << "\nest : " << a*b;
}

Remarques :
  • Le manipulateur flush permet de forcer le vidage de la mmoire tampon associe au fichier de sortie

  • Le manipulateur endl insre d'abord le caractre '\n' avant de faire flush
#include <iostream.h>
void main()
{
 int a,b;
 cout << "Entrer deux entiers" << flush;
 cin >> a >> b;
 cout << "le produit de " << a << " par " << b << "\nest : " << a*b << endl;
}


2) Les commentaires

 C++ admet une autre forme de commentaires en utilisant //. La fin de ligne est considre comme fin de commentaire.

void main()
{
 int a=5, b=8;
 // dclarations de deux variables
 a = a + b;
 // somme
 // de deux variables
}


3) La dclaration des variables

 En C, il est ncessaire de dclarer toutes les variables en dbut de bloc { .. } ou en dbut de programme. En C++, la dclaration peut se faire n'importe o. La porte reste limite au bloc ou la fonction suivant l'endroit o elle a t dclare.

void main()
{
 int nb;
 cout << "taille du tableau :";
 cin >> nb;
 int t[nb];
 for (int i = 0; i < nb; i++)
 {
 cout << "entrer une valeur :";
 cin >> t[i];
 }
 ...
}


4) Les rfrences

 Une donne est accessible soit par le nom d'une variable, soit par l'adresse de la case mmoire o elle est stocke. Il est possible de faire rfrence la mme zone qui contient la donne en utilisant une seconde rfrence.

int i = 1;
int &j = i;
i++; // i et j valent 2
j++; // i et j valent 3

Remarque :
Il n'y a aucune opration sur la rfrence mais uniquement sur l'objet rfrenc.

5) La transmission par rfrence

 En C, la transmission des paramtres par rfrence n'existe pas. On est oblig de la grer en manipulant explicitement des pointeurs. En C++, la transmission par rfrence est possible en faisant prcder le nom de l'argument dans l'en-tte d'une fonction par le symbole &.


Langage C
Langage C++
#include <stdio.h>

void somme (int x, int y, int *z)
{
 *z = x+y;
}

void main(void)
{
 int a, b, c;

 printf ('entrer a ';);
 scanf ("%d",&a);
 printf ("entrer b");
 scanf ("%d",&b);
 somme (a, b, &c);
 printf ("somme : %d\n",c);
}
#include <iostream.h>

void somme (int x, int y, int &z)
{
 z = x + y;
}

void main()
{
 int a, b, c;

 cout << "entrer a ";
 cin >> a;
 cout << "entrer b ";
 cin >> b;
 somme (a, b, c);
 cout << "somme : " << c << "\n";
}


6) Les arguments par dfaut

 Dans la dclaration d'une fonction il est possible de prvoir pour un ou plusieurs arguments une valeur par dfaut. Elle est indique par le symbole = la suite de l'argument. Les arguments par dfaut sont obligatoirement les derniers de la liste.

#include <iostream.h>

int somme (int x, int y=1, int z=1)
{
 return (x+y+z);
}

void main()
{
 int a=2, b=3, c=4;

 cout << "somme : " << somme (a, b, c) << "\n"; // somme : 9
 cout << "somme : " << somme (a, b) << "\n"; // somme : 6
 cout << "somme : " << somme (a) << "\n"; // somme : 4
}


7) La surcharge des fonctions

 Au sein d'un mme programme, il est possible que plusieurs fonctions possdent le mme nom. Le choix de la fonction utilise dpendra du type des arguments l'appel.

float somme (float x, float y) { return (x+y); }

int somme (int x, int y) { return (x+y); }

void main ()
{
 int a=3, b=4;
 float c=2.5, d=1.0;

 cout << somme (a, b) << "\n"; // 7
 cout << somme (c, d) << "\n"; // 3.5
}


8) Allocation dynamique

 En C++, les fonctions malloc() et free() sont remplaces par les oprateurs new et delete.

Exemple : allocation dynamique d'un emplacement mmoire pour y mettre un rel

Langage C
Langage C++
#include <stdlib.h>
...
float *x;
x = (float *) malloc (sizeof(float));
*x = 126.5;
...
free(x);
...

...
float *x;
x = new float;
*x = 126.5;
...
delete x;
...

 En cas de succs, l'oprateur new fournit un pointeur sur la zone mmoire alloue. En cas d'chec, new retourne un pointeur NULL. L'oprateur delete, quant lui permet de librer la place mmoire alloue par new.


Exemple : on veut allouer et librer dynamiquement un emplacement mmoire de 20 caractres conscutifs

char *ptr_tab;

ptr_tab = new char[20];
delete ptr_tab; // quivalent : delete[20] ptr_tab


9) L'oprateur de porte

 En C, tout variable globale est masque dans un bloc si une variable locale de mme nom y est dclare; la variable globale est donc inaccessible dans ce bloc.

int var = 1;
...
void fct()
{
 int var = 134;

 printf ("%d\n", var); // affiche 134
}

 En C++, il existe un oprateur (not '::') appel oprateur de rsolution de porte, qui permet l'accs explicite une variable globale.

int var = 1;
...
void fct()
{
 int var = 134;

 cout << var << ::var; // affiche 1 et 134
}


10) Les conversions explicites

 En C, pour effectuer une conversion explicite, on utilise un forage de type (cast) qui permet de transformer une expression dans le type voulu : (type) expression

Exemple : double moyenne = (double) somme/nb;

 C++ autorise une autre criture pour raliser la mme chose : type (expression)

Exemple : double moyenne = double(somme)/nb


Remarque :
En C++, le type void *, contrairement au C, ne peut tre converti implicitement en un pointeur d'un autre type. Il faut obligatoirement effectuer un forage de type. Par contre tout pointeur peut tre converti implicitement en un pointeur de type void *.

11) Les fonctions "en ligne"

 En C, lorsque le corps d'une fonction est courte et que le temps d'excution est privilgier par rapport l'espace mmoire, on utilise une macro. En C++, l'criture des fonctions peut se faire "en ligne" par l'intermdiaire du qualificatif inline. Dans la macro, la substitution se fait par le prprocesseur, dans la fonction inline, le compilateur sait que chaque occurrence de l'appel de la fonction devra tre remplace par le code machine correspondant.

 Ce type de fonction permet galement d'avoir un contrle plus strict au niveau des paramtres transmis.

// macro de calcul d'un maximum
#define max(a,b) a>b?a:b // aucun contrle sur le type de a et b

// fonction en ligne du calcul du maximum
inline int max (int a, int b) { return (a>b?a:b); } // ici a et b devront tre des entiers


 Limite des fonctions inline :
Le compilateur peut trs bien ignorer une fonction inline si cette dernire est trop "complexe". Par exemple, dans le cas d'une fonction trop longue ou contenant des boucles, le compilateur la considrera comme une fonction simple. Il est donc ncessaire d'utiliser les fonctions inline pour des oprations rapides (squences d'instructions, affectations etc...)


12) Les fonctions gnriques

 Une fonction gnrique est une fonction qui ne dpend pas des types des arguments instancis. Un mcanisme trs puissant est prvu en C++ pour pouvoir crer des fonctions gnriques tout en conservant le contrle de type : c'est le concept des templates.

 Pour crer une fonction gnrique, l'en-tte de la fonction doit tre prcde du mot rserv template suivi d'une liste de paramtres entre les symboles < > Chaque paramtre doit tre de la forme : class identificateur. Le choix de l'identificateur est laiss au programmeur. L'identificateur reprsente un type qui est instanci au moment de la compilation par un type existant.


Exemple :
La permutation de deux valeurs entires et deux valeurs relles ncessite l'criture de deux fonctions distinctes dont les instructions sont identiques except le type des variables. L'criture d'une fonction gnrique permut() permet d'viter cette redondance de code :
template <class T>
void permut (T &a, T &b)
{
 T c;

 c = a; a = b; b = c;
}

void main ()
{
 int x=5, y=8;
 float z=2.5, t=8.9;

 permut (x, y);
 permut (z, t);
}

Remarque :
Le compilateur dtecte une erreur si l'appel de la fonction les deux paramtres sont de types diffrents.
 Pour utiliser des types gnriques diffrents dans une fonction gnrique, il suffit de fournir des noms symboliques diffrents.

template <class T1, class T2>
void fct (T1 a, T2 b)
{
 ...
}


  Retour en haut de page Page suivante