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 :

Préférence entre deux initialisations de string


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Préférence entre deux initialisations de string
    Bonjour

    Supposons que aSet soit une chaine de caractère constante.

    Il faut mieux écrire cette ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::string PrefSetLevel(( aSet.compare("0") )? "M" : "R");

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::string PrefSetLevel = ( aSet.compare("0") )? "M" : "R";
    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Par défaut
    Cela revient au même, dans les deux cas PrefSetLevel sera constante.
    Attention toutefois, compare renvoi 0 si la condition et vrai et un nombre négatif dans le cas contraire, cela fera l'inverse d'un retour de type bool dans la condition :
    Lorsque aSet vaut "0", aSet.compare("0") renverra un entier égal à 0, donc l'opérateur tertiaire renverra "R", qui sera choisi pour affecter PrefSetLevel.
    Et quand aSet est différent de "0", compare("0") renverra un nombre différent de 0 ce qui équivaut à true, et donc PrefSetLevel vaudra "M".

    Cordialement,
    Pop360

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Estce que je dis est ok:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const std::string aSet =  std::string("EUROPE");
    //Appel du constructeur par copie de la classe string

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const std::string aSet =  "EUROPE";
    //Appel du constructeur string(const char * arg)
    //puis du constructeur par copie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const std::string aSet("EUROPE");
    //Appel du constructeur de la classe string 
    //dont la signature est string(const char * arg)

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Par défaut
    Pas tout à fait, ce sont tous des constructeur surchargés.
    Il ne peut y avoir un appel à un constructeur de copie que si il y au moins 2 objets créés.


    Voici un petit code pour l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    #include <iostream>
     
    class MaClasse
    {
        public :
     
           MaClasse();
           MaClasse (int);
           MaClasse(const MaClasse &);
          int operator=(const int &);
          MaClasse & operator=(const MaClasse &);
     
           int getNb() const;
     
       private:
        int wNb;
     
    };
     
     
    MaClasse::MaClasse()
    {
      std::cout << "\nConstructeur par defaut";
    }
     
    MaClasse::MaClasse(int nb)
    {
      std::cout << "\nConstructeur de surcharge";
      wNb = nb;
    }
     
    MaClasse::MaClasse(const MaClasse &rhs)
    {
        std::cout << "\nConstructeur de copie";
        wNb = rhs.getNb();
    }
     
    int MaClasse::getNb() const
    {
      return wNb;
    }
     
    int
    MaClasse::operator=(const int&nb)
    {
        wNb = nb;
        return wNb;
    }
     
     
    int main()
    {
        MaClasse classe_1; // Par défaut
     
        std::cout << "\n--";
     
        MaClasse classe_2 = 5; // Surcharge
     
        std::cout << "\n--";
     
        MaClasse classe_3(5); // Surcharge
     
        std::cout << "\n--";
     
        MaClasse classe_4 = MaClasse(5); // Surcharge
     
        std::cout << "\n--";
     
        MaClasse classe_5 = classe_1; // Copie
     
     
    std::cout << "\n\n\n";
    return 0;
    }

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const std::string aSet =  std::string("EUROPE");
    //Appel du constructeur par copie de la classe string
    // En C++98, OUI, après un appel du constructeur string(const char * arg)
    // Des optimisations sont possibles, qui feraient que certains appels seraient supprimés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const std::string aSet =  "EUROPE";
    //Appel du constructeur string(const char * arg)
    //puis du constructeur par copie
    // NON. Appel du constructeur string(const char * arg), et c'est tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::string aSet("EUROPE");
    //Appel du constructeur de la classe string 
    //dont la signature est string(const char * arg)
    // OUI
    Par ailleurs, dans ton premier exemple, j'écrirais plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string const PrefSetLevel(aSet == "0" ? "M" : "R");
    Voire (mais c'est de la micro optimisation, à ne faire qu'après bench positif) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string const PrefSetLevel(1, aSet == "0" ? 'M' : 'R');
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Quand je fais cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string const aSet("0"); 
    std::string const PrefSetLevel(aSet == "0" ? "M" : "R");
    j'ai comme erreur:


    error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Le code suivant compile chez moi (Visual C++2010) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <string>
     
    int main()
    {
    std::string const aSet("0"); 
    std::string const PrefSetLevel(aSet == "0" ? "M" : "R");
     
    }
    J'ai testé avec Comeau, il compile aussi. Quel compilo utilises-tu ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. [gthumb] synchro des préférences entre deux ordis
    Par Celano dans le forum Imagerie
    Réponses: 1
    Dernier message: 13/08/2012, 13h58
  2. Partage de préférences entre deux applications
    Par nicroman dans le forum Android
    Réponses: 13
    Dernier message: 17/08/2011, 21h29
  3. string.format : mettre un espace entre deux chiffres
    Par SOPRA-Eherve dans le forum VB.NET
    Réponses: 2
    Dernier message: 06/03/2007, 14h55
  4. [SAX] Comment récupérer un String entre deux balise xml?
    Par L4BiN dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 23/06/2006, 09h02
  5. [.NET VC++] ou exclusif entre deux String
    Par benoitB dans le forum MFC
    Réponses: 7
    Dernier message: 25/11/2003, 11h20

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