Outils d'utilisateurs

Outils du Site


enum_class

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

enum_class [2016/06/14 17:37]
barfedbean [constantes]
enum_class [2016/08/23 00:45] (Version actuelle)
gbdivers
Ligne 1: Ligne 1:
  
 ^ [[rvalue_et_lvalue|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[inference_de_type|Chapitre suivant]] ^ ^ [[rvalue_et_lvalue|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[inference_de_type|Chapitre suivant]] ^
 +
 +<note warning>Les chapitres suivants sont encore en cours de rédaction, voire à l'état d'ébauche. N’hésitez pas a faire des remarques ou poser des questions sur le forum de [[http://zestedesavoir.com/forums/|Zeste de Savoir]] ou de [[http://openclassrooms.com/forum/sujet/nouveau-cours-c-moderne|OpenClassroom]].</note>
  
 ====== Constantes et énumérations ====== ====== Constantes et énumérations ======
Ligne 33: Ligne 35:
  
  
-===== énumérations =====+===== Les enumérations =====
  
-Plusieurs constantes, regroupees dans un meme scope.+Une enumeration est une liste de valeurs constantes. Chaque valeur a un nom et l'ensemble des noms sont regroupes dans le nom de l'enumeration. 
 + 
 +Pour declarer une enumeration et des valeurs, la syntaxe generale est la suivante :
  
 <code cpp> <code cpp>
-enum class MyEnum +enum class NOM_ENUMERATION 
-    value_1 = 123, +    LISTE_DE_VALEURS
-    value_2 = 456  +
 }; };
 </code> </code>
  
-Utilisation : avec operateur de portee ''::''+Le nom de l'enumeration est "NOM_ENUMERATION". Par exemple, pour definir une enumeration de couleurs (vide pour le moment) :
  
 <code cpp> <code cpp>
-int x = MyEnum::value_1;+enum class Couleur { 
 +    ... 
 +};
 </code> </code>
  
-<note>**Anciennes syntaxe**s+La liste de valeurs est une liste d'identifiants separees par des virgules. 
  
-Sans le mot cle ''class''Definit les enum dans la portee globale+<code cpp> 
-</note>+NOM_VAlEUR_1, NOM_VALEUR_2, ..., NOM_VALEUR_N 
 +</code>
  
-===== Notion de portée =====+Par exemple :
  
 <code cpp> <code cpp>
-enum class MyEnum +enum class Couleur 
-    value_1 = 123 +    Noir, Blanc, Rouge, Jaune, Bleu, Orange, Vert, Violet
 }; };
 +</code>
  
-int value_1 456;+(Note : pour rappel, les retours a la ligne sont utilises librement en C++. Cette liste est definie sur une seule ligne, mais ca serait equivalent d'ecrire chaque valeur sur une ligne differente). 
 + 
 +Dans cet exemple, l'enumeration s'appelle ''Couleur''. Elle contient 8 valeurs : ''Noir'' a ''Violet''. 
 + 
 +Une enumeration definie un nouveau type, il est donc possible de definir une variable du type "NOM_ENUMERATION". Pour utiliser les valeurs definies dans une enumeration, il faut simplement utiliser l'operateur de portee ''::'' (scope operator). 
 + 
 +<code cpp> 
 +NOM_ENUMERATION NOM_VARIABLE {}; 
 +NOM_VARIABLE NOM_ENUMERATION :: NOM_VALEUR;
 </code> </code>
  
-L'identifiant ''value_1'' est defini 2 fois. Dans les regles de nommage, on a dit que chaque identifiant devait etre defini 1 seule fois, pourquoi cela fonctionne ? Par ce qu'ils sont dans des portees differentes.+Par exemple :
  
-<code cpp main.cpp> +<code cpp> 
-#include <iostream> +enum class Couleur 
-     +    Noir, Blanc, Rouge, Jaune, Bleu, Orange, Vert, Violet 
-int main() { +}; 
-    enum class MyEnum + 
-        value_1 = 123  +Couleur une_couleur { Couleur::Rouge } // initialisation 
-    }; +une_couleur = Couleur::Bleu            // affectation
-     +
-    int value_1 = 456; +
-     +
-    std::cout << value_1 << std::endl+
-    std::cout <;< static_cast<int>(MyEnum::value_1) << std::endl +
-}+
 </code> </code>
  
 +Les valeurs des enumerations peuvent etre converties en nombre entier, en utilisant l'operateur de conversion "static_cast" :
  
 +<code cpp>
 +const auto c = static_cast<int>(une_couleur);  // convertie le type "Couleur" en type "int"
 +</code>
 +
 +Par defaut, les valeurs de l'enumeration sont converties en entier selon leur ordre dans l'enumeration, en commencant de 0 :
 +
 +<code cpp>
 +std::cout << static_cast<int>(Couleur::Noir) << std::endl;
 +std::cout << static_cast<int>(Couleur::Blanc) << std::endl;
 +std::cout << static_cast<int>(Couleur::Rouge) << std::endl;
 +std::cout << static_cast<int>(Couleur::Vert) << std::endl;
 +</code>
 +
 +affiche :
 +
 +<code>
 +0
 +1
 +2
 +6
 +</code>
 +
 +Il est possible de definir la valeur entiere correspondant a chaque valeur de l'enumeration en utilisant =. Les valeurs qui ne sont pas explicitement definies prennent la valeur precedente + 1.
 +
 +<code cpp>
 +enum class Couleur {
 +    Noir,         // prend automatiquement la valeur 0
 +    Blanc,        // prend automatiquement la valeur 1
 +    Rouge = 100,  // prend explicitement la valeur 100
 +    Jaune = 200,  // prend explicitement la valeur 200
 +    Bleu,         // prend automatiquement la valeur 201
 +    Orange,       // prend automatiquement la valeur 202
 +    Vert,         // prend automatiquement la valeur 203
 +    Violet        // prend automatiquement la valeur 204
 +};
 +
 +std::cout << static_cast<int>(Couleur::Rouge) << std::endl;
 +std::cout << static_cast<int>(Couleur::Vert) << std::endl;
 +</code>
 +
 +affiche :
 +
 +<code>
 +100
 +203
 +</code>
 +
 +Il est également possible de convertir un nombre entier en valeur d'une enumeration avec "static_cast".
 +
 +<code cpp>
 +const auto c = static_cast<Couleur>(1);
 +assert(c == Couleur::Blanc);
 +</code>
 +
 +<note>**Ancienne syntaxe**
 +
 +Meme syntaxe, sans le mot-clé ''class''. 
 +
 +<code cpp>
 +enum Couleur {
 +    Noir, Blanc, Rouge, Jaune, Bleu, Orange, Vert, Violet
 +};
 +
 +Couleur une_couleur { Rouge };  // initialisation
 +une_couleur = Bleu;             // affectation
 +</code>
 +
 +Definit les enum dans la portee globale (//unscoped enum//). "Dans la portée globale" signifie qu'il n'est pas nécessaire d'indiquer la portée ''Couleur::''. Cela peut provoquer des conflits, par exemple :
 +
 +<code cpp>
 +enum Pion {
 +    Noir, Blanc
 +};
 +
 +enum Couleur {
 +    Noir, Blanc, Rouge, Jaune, Bleu, Orange, Vert, Violet // confit
 +};
 +</code>
 +affiche les erreurs suivantes :
 +
 +<code>
 +main.cpp:8:5: error: redefinition of enumerator 'Noir'
 +    Noir, Blanc, Rouge, Jaune, Bleu, Orange, Vert, Violet // confit
 +    ^
 +main.cpp:4:5: note: previous definition is here
 +    Noir, Blanc
 +    ^
 +main.cpp:8:11: error: redefinition of enumerator 'Blanc'
 +    Noir, Blanc, Rouge, Jaune, Bleu, Orange, Vert, Violet // confit
 +          ^
 +main.cpp:4:11: note: previous definition is here
 +    Noir, Blanc
 +          ^   
 +</code>
 +
 +Ce type d'énumération ne nécessite pas de conversion explicite avec ''static_cast'' pour convertir en entier, les valeurs sont convertie implicitement (promotion) entiers.
 +</note>
  
  
 ^ [[rvalue_et_lvalue|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[inference_de_type|Chapitre suivant]] ^ ^ [[rvalue_et_lvalue|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[inference_de_type|Chapitre suivant]] ^
 +
enum_class.1465918675.txt.gz · Dernière modification: 2016/06/14 17:37 par barfedbean