IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Initialisation d'une variable


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Retraité, mais avide de savoir
    Inscrit en
    Mars 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité, mais avide de savoir

    Informations forums :
    Inscription : Mars 2022
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Initialisation d'une variable
    Bonjour,
    Comme vous le savez, bien mieux que moi, il existe différentes façons pour initialiser une variable. Entre autres, int a(0); int a = 0; int a{0}...Ma question, quelle est celle que je dois privilégier?

    Merci et bonne après-midi

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Dans le cas d'un type de base que l'on initialise avec une valeur de même type, les 4 initialisations sont équivalentes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	int  i1 = 1;   // initialisation par copie
    	int  i2{2};    // initialisation directe (car 2 et i2 ont le même type)
    	int  i3(3);    // initialisation directe
    	int  i4 = {4}; // initialisation par liste copie
    	// j'en ajoute deux autres pratiques à connaître pour des types complexes à écrire
    	auto  i5 = int{5};    // équiv à i2
    	auto  i6 = int(6);    // équiv à i3
    On pourrait aussi utiliser auto à la place de int dans le code précédent.

    Si une conversion est nécessaire et nécessite une conversion restrictive, les initialisations avec {} ne passeront pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	int  c1 = 1.5;         // au mieux un warning
    	//int  c2{2.5};           erreur conversion par liste directe restrictive
    	int  c3(3.5);          // au mieux un warning
    	//int  c4 = {4.5};        erreur conversion par liste copie restrictive
    Si le type destination nécessite une conversion explicite, ce sont les initialisations avec = qui ne passeront pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct EInt {
    	explicit EInt( int x ) {}
    };
    	//EInt  E1 = 1;    erreur conversion impossible
    	EInt  E2{2};
    	EInt  E3(3);
    	//EInt  E4 = {4};  erreur conversion impossible
    Et donc si à la fois la conversion est explicite et nécessite une conversion restrictive, seule l'initialisation avec les parenthèses est acceptée. C'est celle qui va prendre tous les risques...

    Alors, laquelle préférer? Celle qui nous donne le plus de garanties de ne pas faire n'importe quoi. Donc la quatrième avec = et {}.

    Mais attention, s'il existe ces quatre manières d'initialiser, c'est que parfois elles se distinguent et, il faut alors utiliser la bonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector<int>  v1{4};    // un tableau d'un élément qui vaut 4
    std::vector<int>  v2(4);    // un tableau de 4 éléments tous nuls
    std::vector<int>  v3 = 4;   // ne compile pas
    Ici on ne s'est intéressé qu'au cas où l'initialisation demandait un unique paramètre. S'il y en a 0 ou bien plusieurs, l'utilisation des {} est aussi celle à préférer.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Retraité, mais avide de savoir
    Inscrit en
    Mars 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité, mais avide de savoir

    Informations forums :
    Inscription : Mars 2022
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Merci
    Un grand merci pour cette magistrale réponse!

    Je vous souhaite une année 2024 constellée de surprises agréables et remplie de rendez-vous avec le bonheur et le succès
    Jean-Pierre

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    J'avais fait un tableau sur un autre forum qui montre les différentes formes d'initialisations possible. Depuis C++20 et la possibilité d'initialiser les membres d'une structure sans avoir de constructeur, les différences en faveur de {} sont la conversion avec perte qui donne une erreur de compilation, les initialisations désignées, le MVP (Most Vexing Parse) qui n'existe pas. Dans le comportement qui diffère, il y a le traitement de std::initializer_list dans les constructeurs.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Initialisation d'une variable externe
    Par ForgetTheNorm dans le forum Assembleur
    Réponses: 1
    Dernier message: 15/11/2006, 08h54
  2. [VB.Net]Déclaration et initialisation d'une variable
    Par DonF dans le forum Windows Forms
    Réponses: 6
    Dernier message: 14/11/2006, 20h05
  3. Initialisation d'une variable Object
    Par bobic dans le forum Langage
    Réponses: 2
    Dernier message: 08/09/2006, 17h21
  4. Vérifier l'initialisation d'une variable
    Par homeostasie dans le forum C
    Réponses: 11
    Dernier message: 04/08/2006, 18h05
  5. initialisation d'une variable DATE
    Par olivll dans le forum Access
    Réponses: 4
    Dernier message: 25/07/2006, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo