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++

  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.

  8. #8
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    j'utilise VS2008. Donc cela vient peut etre de cela

  9. #9
    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
    J'ai de très forts doutes. As tu tenté de compiler exactement le code que je t'ai passé ?
    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.

  10. #10
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    ok, ca compile!

  11. #11
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Puisqu'on parle de simplification de code, je voudrais avoir votre avis sur le code suivant, surtout sur la simplification et l'amélioration syntaxique. Je sais par exemple qu'il vaut mieux remplacer les if par des cases.
    Mais si vous avez des idées sur la simplification, je suis preneur.

    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
    if (vMat.underlyingMat().kind() == MyEnum::future)
        { 
    	if (_futmodel == MyEnum::MODEL_HJM) 
    			return &_parametersHJM;
     
     
    	if (_futmodel == MyEnum::MODEL_SABR) 
                                              return &_parametersBlack;
     
        if (_futmodel == MyEnum::MODEL_HJM_LOCAL) 	
    			     return &_parametersHJM;
     
    	if (_futmodel == MyEnum::MODEL_HJM_LIKE_INFLA) 
    		        	   return &_parametersHJM;
     
    	return &_parametersBlack;
    	}
    else 
        {
      	if (_model == MyEnum::MODEL_HJM) 
    			return &_parametersHJM;
     
    	if (_model == MyEnum::MODEL_SABR)
    			return &_parametersSABR;
     
    	if (_model == MyEnum::MODEL_HJM_LOCAL)
    			return &_parametersHJM_LOCAL;
     
    	if (_model == MyEnum::MODEL_HJM_LIKE_INFLA)
    			return &_parametersHJM_LIKE_INFLA;
     
     
    	return &_parametersBlack;
    	}

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