Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Langage C++
  3. Constantes
Extrait - Langage C++ De l'héritage C au C++ moderne (avec programmes d'illustration) (2e édition)
Extraits du livre
Langage C++ De l'héritage C au C++ moderne (avec programmes d'illustration) (2e édition) Revenir à la page d'achat du livre

Constantes

Constantes const et constexpr

1. Hérité du C

Le mot-clé const ajouté à la déclaration d’une variable la rend constante.

Une constante doit être initialisée à la déclaration et ensuite sa valeur ne peut plus changer.

const int TX = 50; 
const int TY = 20; 

déclare deux constantes TX et TY.

Écrire ensuite :

TX = 100; 

provoque une erreur à la compilation.

int main() 
{ 
    const int TY = 100; // oui 
 
    const int TX;// erreur, initialisation obligatoire 
 
    TX = 100;    // erreur, pas d'affectation de valeur possible 
 
    return 0; 
} 

Le mot-clé const peut se placer avant ou après le type indifféremment :

const int TX = 10;

est équivalent à :

int const TX = 10;

2. Apports du C++

a. Plus de rigueur sur const

L’instruction d’initialisation de la constante à sa déclaration est exécutée pendant le déroulement du programme, le run-time en anglais. La valeur de la constante n’est donc pas définie en amont pendant la compilation. Cette spécificité permet ainsi de définir des constantes pendant le déroulement du programme, notamment en paramètre de fonction. Malencontreusement, il est possible en C de modifier la valeur d’une constante en passant par son adresse mémoire :

const int cval = 10; 
int* p = &cval; 

p est un pointeur, c’est-à-dire une variable qui prend pour valeur une adresse mémoire, &cval donne l’adresse mémoire de cval. Cette adresse est affectée au pointeur p et *p permet d’accéder à l’adresse que contient p et d’y écrire une nouvelle valeur :...

Énumérations : créations de types enum

1. Hérité du C

Le mot-clé enum permet de créer une liste de constantes entières dont les valeurs sont ajustées automatiquement de 1 en 1. Par exemple :

enum {NORD,EST,SUD,OUEST}; 

NORD, EST, SUD, OUEST sont quatre constantes qui valent respectivement 0, 1, 2, 3.

Par défaut, la première vaut 0 et la valeur suivante est incrémentée de 1 par rapport à la précédente. Mais il est possible de spécifier une valeur pour n’importe quel membre de l’énumération, par exemple :

enum {NORD = -5,EST,SUD,OUEST}; 

NORD vaut -5, EST -4, SUD -3, OUEST -2.

enum {NORD = 50,EST,SUD=10,OUEST}; 

NORD vaut 50, EST 51, SUD 10, OUEST 11.

Le mot-clé enum utilisé seul comme ci-dessus produit des énumérations anonymes. Mais il est possible de nommer l’enum afin de définir un type d’enum qui va permettre de déterminer des variables associées à ce type d’enum. Par exemple :

enum Dir {NORD,EST,SUD,OUEST}; 

Cette définition de enum Dir crée le type enum Dir qui donne la possibilité ensuite de déclarer des variables enum Dir :

enum Dir d; 

d est une variable de type enum Dir, à savoir une variable qui en principe ne peut prendre que des valeurs contenues dans l’enum. Le C cependant ne contrôle pas la valeur d’une variable de type enum et elle est considérée comme un int ordinaire. En C le type d’une variable enum constitue uniquement une indication sur son utilisation.

#include <iostream>  
 
// définition du type enum Dir 
enum Dir { NORD, EST, SUD, OUEST }; 
 
int main() 
{ 
    // variable de type enum Dir. ...

Directive macroprocesseur #define

Une directive macroprocesseur #define peut être utilisée comme alternative à une constante. C’est un usage très fréquent en C, mais un peu moins en C++ où les constantes const ou constexpr sont préférées. La syntaxe macro est simple pour avoir une valeur constante :

<#define>  <Nom>   <valeur de remplacement> 

Attention, il n’y a pas de point-virgule final. Par exemple :

#define TX      80 

signifie que dans le programme, partout où est utilisé TX, TX sera remplacé par la valeur 80 à la compilation. Cela revient pratiquement au même que d’utiliser une constante de même nom. Disons que c’est typiquement C.

Mais la directive macroprocesseur #define ne se limite pas à définir des constantes, elle permet beaucoup d’autres utilisations. La « valeur de remplacement » peut être constituée par un appel de fonction ou même un extrait de code plus fourni.

#include <iostream> 
 
#define MAX 100 
#define MIN MAX / 2 
 
#define RANDMINMAX MIN + rand() % MAX 
 
int main() 
{ 
    Std::srand(time(NULL)); 
 
    std::cout << "tirage aleatoire entre " 
              << MIN << " et " << MAX << " : " 
              << RANDMINMAX << std::endl; 
 
    std::cin.get(); 
    return 0; 
} 

La fonction rand() de la bibliothèque C standard <cstdlib> retourne un nombre pseudo aléatoire, elle...