void test()
 int a = 5;
 cout « "a = " « a « endl; // a = 5
 incrementer(a);
 cout « "a = " « a « endl; // a = 6
Le paramètre ainsi passé ne peut être qu'une variable.
Sa valeur peut être modifiée dans la fonction appelée, à moins d'utiliser le mot codice_35 :
void incrementer(const int& value)
 value++; // <- erreur générée par le compilateur
void test()
 int a = 5;
 cout « "a = " « a « endl;
 incrementer(a);
 cout « "a = " « a « endl;
La question que l'on peut se poser est "puisque le passage par référence permet de modifier le paramètre, pourquoi l'en empêcher, et ne pas utiliser un simple passage par valeur ?"
La réponse se trouve lorsqu'on utilise des objets ou des structures.
Le passage par valeur d'un objet ou d'une structure demande une recopie de la valeur de ses membres (utilisant un constructeur de recopie pour les objets).
L'avantage de passer une référence est d'éviter la recopie. Le mot codice_35 permet de garantir qu'aucun membre de l'objet ou de la structure n'est modifié par la fonction.
Pointeur de fonction.
Un pointeur de fonction stocke l'adresse d'une fonction, qui peut être appelée en utilisant ce pointeur.
La syntaxe de la déclaration d'un tel pointeur peut paraître compliquée, mais il suffit de savoir que cette déclaration est identique à celle de la fonction pointée, excepté que le nom de la fonction est remplacé par codice_37.
Obtenir l'adresse d'une fonction ne nécessite pas l'opérateur codice_33. Il suffit de donner le nom de la fonction seul.
Exemple :
using namespace std;
int (* pf_comparateur)(int a, int b);
// peut pointer les fonctions prenant 2 entiers en arguments et retournant un entier
int compare_prix(int premier, int second)
 return premier - second;
int main()
 pf_comparateur = &compare_prix;
 cout « "compare 1 et 2 : " « (*pf_comparateur)(1, 2) « endl;
 return 0;
La syntaxe d'appel à une fonction par un pointeur est identique à l'appel d'une fonction classique.
Passage de fonctions en paramètre.
Il s'agit en fait de passer un pointeur de fonction.
Exemple :
void sort_array( int[] data, int count, int (* comparateur_tri)(int a, int b) );
Pour clarifier la lecture du code, il est préférable d'utiliser l'instruction codice_39 :
typedef int (* pf_comparateur)(int a, int b);
void sort_array( int[] data, int count, pf_comparateur comparateur_tri );
Exercices.
Exercice 1.
Créez une fonction codice_40 pour calculer la factorielle d'un entier n.
Elle retourne un entier long.
Créez une fonction non récursive.
Exercice 2.
Créez une autre fonction codice_40 mais récursive cette fois.
Exercice 3.
Donner la déclaration d'un pointeur codice_42 sur la dernière fonction codice_40.
Exercice 4.
En C++, les systèmes codice_44 sont des systèmes qui enregistrent des fonctions, afin de les exécuter en cas d'évènement (comme par exemple si on touche le clavier).
Albert n'est pas fort en maths. Il veut un système pour faire des racines carrées, des carrés, des cosinus et des factorielles.
Il utilise l'environnement callback situé dans l'annexe 1.
Cet environnement crée une structure f_maths, qui enregistre une fonction et son symbole mathématique.
Pour utiliser sa calculatrice, il doit enregistrer correctement les fonctions dans le gestionnaire.
Ensuite, le programme interroge l'utilisateur pour entrer le symbole de son opération.
Puis, l'utilisateur entre sa valeur et le programme effectue l'opération.
Compléter le programme en annexe avec la fonction main() uniquement.

Programmation C++/Compilation
Définition de la compilation.
La compilation consiste en une série d'étapes de transformation du code source en du code machine exécutable sur un processeur cible.
Le langage C++ fait partie des langages compilés : le fichier exécutable est produit à partir de fichiers sources par un compilateur.
Contrairement aux langages interprétés où il faut un logiciel interprétant le source, le fichier exécutable est produit pour une machine donnée : il est directement exécuté par le processeur.
L'exécution est donc plus rapide.
Phases de la compilation.
La compilation passe par différentes phases, produisant ou non des fichiers intermédiaires :
Les compilateurs sont capables de générer des bibliothèques statiques, qui sont en quelques sortes le rassemblement d'un ensemble de fichiers objet au sein d'un même fichier. Dans ce cas, la phase d'édition de liens n'a pas eu lieu.
Cette découpe en phases permet de compiler séparément les bibliothèques en fichiers objets, et l'application et évite donc de tout re-compiler, ce qui prendrait beaucoup de temps pour les applications ayant un code source important.
Les fichiers sources.
Les fichiers sources d'un programme C++ portent souvent l'extension .cpp, .cxx, .cc, parfois .C et sont des fichiers textes lisibles par le programmeur. 
Les fichiers d'en-tête.
Les fichiers "entêtes" ("headers" en anglais), traditionnellement d'extension codice_4 ou codice_5 (mais la plupart des entêtes systèmes du C++ standard n'ont plus d'extension du tout), contiennent généralement les prototypes de différentes fonctions, structures et classes. Ces prototypes proviennent :
Les fichiers .cpp.
Les fichiers codice_6 (parfois codice_7 ou codice_8) contiennent la définition (l'implémentation) des différentes fonctions et méthodes définies dans les fichiers d'en-tête. La compilation des fichiers codice_6 produit dans un premier temps des fichiers objets (extension codice_2 ou codice_3 en général).
À noter que ces fichiers codice_6 utilisent les fichiers d'en-tête. Ils les appellent en utilisant la syntaxe codice_13 (nomdefichier comprenant l'extension, donc, souvent ".h"). Comme indiqué ci-dessus, ces fichiers d'en-tête seront donc inclus complètement par le préprocesseur à l'intérieur du code source brut.
L'édition de liens (linking).
L'édition de liens est la phase finale de la compilation qui va rassembler tous les fichiers objets afin de former un fichier exécutable. Les fichiers objets proviennent :
Les projets.
Les makefiles.
Afin de rendre possible le développement d'applications, les fichiers sources sont organisés sous forme de projet. Le C++ ayant été conçu sur les bases du C, il s'est ensuivi une gestion assez équivalente des projets. Avant l'avènement des environnements intégrés tels qu'on les connaît aujourd'hui, bon nombre de projets étaient construits sous forme de "makefile"s pris en charge par un outil spécifique make. De nos jours, cette technique est encore fortement utilisée dans les environnements UNIX et Linux. Il existe des alternatives plus modernes à "make" tels que CMake, automake, SCons, Boost.Build (bjam)…
Les environnements de développement intégrés.
Les environnements de développement intégrés (EDI en français et IDE en anglais) sont des outils complets permettant de développer dans un certain langage de programmation. Ils contiennent en général :