# Programmation C++/Les références

* Avant-propos
* Introduction
* Compilation
* Un premier programme
* Les commentaires
* Le préprocesseur
* Les types de base et les déclarations
** Exercices
* Les opérations de base
* Les entrées-sorties
* Les pointeurs
** Exercices
* Les références
* Les tableaux
** Exercices
** Exercices sur les tableaux statiques
** Exercice : Tris des tableaux à une dimension
** Solution : Tris des tableaux à une dimension
* Les structures de contrôle
** Exercices
** Exercices if...else et switch
* Les fonctions
** Exercices
* Les structures
** Exercices
* Les classes
** Exercices
** Exercices de développement
* Les espaces de noms
* Les exceptions
* Les templates
** Exercices
* Conventions d'appel
* Les fichiers
* La librairie standard
* Expressions rationnelles
* Interfaces graphiques
* Bibliographie et liens

## Anciennes pages

* Opérateurs
* Héritage
* Polymorphisme
* Avant-propos
* Introduction
* Compilation
* Un premier programme
* Les commentaires
* Le préprocesseur
* Les types de base et les déclarations
** Exercices
* Les opérations de base
* Les entrées-sorties
* Les pointeurs
** Exercices
* Les références
* Les tableaux
** Exercices
** Exercices sur les tableaux statiques
** Exercice : Tris des tableaux à une dimension
** Solution : Tris des tableaux à une dimension
* Les structures de contrôle
** Exercices
** Exercices if...else et switch
* Les fonctions
** Exercices
* Les structures
** Exercices
* Les classes
** Exercices
** Exercices de développement
* Les espaces de noms
* Les exceptions
* Les templates
** Exercices
* Conventions d'appel
* Les fichiers
* La librairie standard
* Expressions rationnelles
* Interfaces graphiques
* Bibliographie et liens

## Anciennes pages

* Opérateurs
* Héritage
* Polymorphisme
[ Modifier le sommaire ]

## Présentation des références

Une référence peut être vue comme un alias d'une variable. C'est-à-dire qu'utiliser la variable, ou une référence à cette variable est équivalent. Ce qui signifie que l'on peut modifier le contenu de la variable en utilisant une référence.
Une référence ne peut être initialisée qu'une seule fois : à la déclaration. Toute autre affectation modifie en fait la variable référencée. Une référence ne peut donc référencer qu'une seule variable tout au long de sa durée de vie.

### Déclaration

La déclaration d'une variable de type référence doit inclure son initialisation :
Un paramètre de méthode ou de fonction de type référence est initialisé lors de l'appel à celle-ci :

### Sémantique

La variable identificateur est une référence vers la variable variable. La variable variable doit être de type type.

### Exemple de programme
#### Explications

* Dans ce programme, on définit 3 variables entières a, b et c et on initialise a à 98 et b à 78.
* int &x=a; permet de déclarer une référence x vers la variable a. x+5 vaut donc la même chose que a+5 donc 103.
* c=x+5; permet donc de transférer 103 dans la variable c.
* int &y=b; permet de déclarer une référence y vers la variable b. a+10 vaut 98+10 donc 108.
* y=a+10; permet de transférer 108 dans la variable b.
* on affiche ensuite b et c c'est-à-dire respectivement 108 et 103.

### Pourquoi utiliser une référence ?

C'est la question qui peut se poser en regardant l'exemple ci-dessous, où il serait plus clair d'utiliser directement des variables.
Les références sont principalement utilisées pour passer des paramètres aux fonctions. Voir le chapitre sur les fonctions, section « passage de paramètres par référence ».
Les références constantes sont également utilisées pour référencer des résultats de retour de fonctions afin d'éviter les copies. C'est particulièrement indiqué dans le cas d'objets retournés par des fonctions. Dans ce cas, la valeur ou objet temporaire retourné a une durée de vie aussi longue que la référence.
Exemple :

## Les références et leur lien avec les pointeurs

Une référence est un pointeur que l'on ne peut pas réaffecter (car le compilateur l'interdit), qui se déréférence automatiquement (à l'inverse d'un pointeur pour lequel on doit utiliser l'opérateur d'indirection), et dont à l'inverse d'un pointeur on ne peut connaître l'adresse car le compilateur ne le permet pas. En effet, si v est une référence alors &v donnera l'adresse de l'objet référencé par v, et non l'adresse de la case mémoire où est stockée la référence.

## Exercices
### Exercice 1

Faites une fonction dont la déclaration sera void échanger(int & a, int & b) qui devra échanger les deux valeurs.

### Exercice 2

Faites une fonction pour calculer la factorielle d'un nombre. Sa déclaration sera int fact(int & n). La fonction sera récursive et la valeur de retour sera n. En cas de problèmes, consulter l'Aide 1.
La factorielle (notée "!") est une fonction mathématique. Voici quelques exemple : 4! = 4 x 3 x 2 x 1 = 24 3! = 3 x 2 x 1 = 6 2! = 2 x 1 = 2 1! = 1 Notez que : 4! = 4 x 3! 3! = 3 x 2! 2! = 2 x 1! = 2 x 1 D'où : !n = n x !(n-1) si n > 1
Voici un exemple de fonction récursive qui ne répond pas à la consigne d'avoir une déclaration int factorielle (int & n) et qui par conséquent ne peut être qualifiée de solution à l'exercice 2 :
Une autre solution est (mais la fonction retourne factoriel n, pas n) :
Une autre solution :

## Tests
### Test 1

Indiquez si la syntaxe est correcte ou non.

#### Solution

* vrai
* vrai
* faux
* vrai
* faux

### Test 2

Dans ces exemples, trouvez ce que le programme va afficher.