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 :

nombre et nombre&


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 402
    Billets dans le blog
    16
    Par défaut nombre et nombre&
    Bonjour,

    quelle est la différence entre ces deux déclarations?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      nombre operator=(std::string nombre_str);//peut prendre un littéral
      nombre& operator=(std::string nombre_str);//peut prendre un littéral
    quelqu'un a une idée?

  2. #2
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 402
    Billets dans le blog
    16
    Par défaut
    à quoi sert le '&' dans le type de retour de fonction?

  3. #3
    Membre chevronné
    Homme Profil pro
    web a11y
    Inscrit en
    Avril 2014
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : web a11y
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 191
    Par défaut
    C'est we, les gens ne sont peut-être pas à la plage, mais ils peuvent être ailleurs…

    Peut-être un début de réponse sur Stackoverflow ?

    En gros, il s'agit de référence pour laquelle le C++ refuse que ce soit nul.
    Mais ce n'est pas moi ze spécialiste.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    Bonjour,

    Le & pour un retour de fonction a la même signification qu'en déclaration de paramètre, qu'en déclaration de variable, qu'en qualificateur de this dans une déclaration de fonction! C'est un un peu à la base du C++, il indique une référence.

    Plus de détails ici.

    Ce qui distingue les 2 fonctions:
    - la première retourne un objet nombre, ce qui n'a pas vraiment de sens ici car l'opérateur de génère pas de nombre!
    - la seconde retourne une référence à un nombre, le code de l'opérateur terminant vraisemblablement par return *this;.

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 770
    Par défaut
    @dalfab confirme que cela ne sert à rien : je me posais la question.

    Il faut vérifier mais pour les opérateurs, retourner 1 référence permet de chaîner les opérateurs.
    Par exemple, si tu fais std::string& operator*(std::string&), après tu pourras faire str4 = str3 * str2 * str1. str2 * str1 va donc produire 1 std::string temporaire qui pourra être utilisé pour faire str3 * tmp.

    D'ailleurs, avec les opérateurs, tu ne peux pas vraiment faire ce que tu veux en terme de paramètres ou de retour : tu es presque obligé pour certains de mettre des références (il faut lire les références pour cela)
    Pareil pour les opérateurs amis (friend) : cela permet de mettre l'objet pas forcément à gauche mais aussi à droite.
    Par exemple, si tu fais std::string& friend operator+(int)], après tu pourras faire str1 = str2 + 4 ou str1 = 4 + str2.

    Il faut vérifier, surtout avec les différentes normes qui ont peut-être modifié les comportements du C++03

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    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 : 760
    Par défaut
    Citation Envoyé par foetus Voir le message
    Il faut vérifier mais pour les opérateurs, retourner 1 référence permet de chaîner les opérateurs.
    Par exemple, si tu fais std::string& operator*(std::string&), après tu pourras faire str4 = str3 * str2 * str1. str2 * str1 va donc produire 1 std::string temporaire qui pourra être utilisé pour faire str3 * tmp.
    Cela aurait plus de sens de présenter str3 += str2 += str1; qui est horrible mais dont l'opérateur += retourne habituellement une référence. Ou simplement str3 = str2 = str1 puisqu'ici on parle de =. cppreference contient une page qui liste les prototypes usuels: https://en.cppreference.com/w/cpp/la...ions#Operators (il faut cliquer sur les titres du tableau).

    Les prototypes sont mappés sur ce qu'on trouve en C avec les types de base. En pratique, je pense que retourner void cause moins de problème (sauf lorsqu'on implémente operator bool pour faire if ((x = foo())) ...).

    Citation Envoyé par foetus Voir le message
    D'ailleurs, avec les opérateurs, tu ne peux pas vraiment faire ce que tu veux en terme de paramètres ou de retour : tu es presque obligé pour certains de mettre des références.
    Non, il n'y a aucune restriction sur le type, on peut mettre n'importe quoi. Il n'y a que operator++(int)/operator--(int) qui demande obligatoirement un int et operator-> qui devient inutilisable si on met n'importe quoi en retour (mais le compilateur n'empêchera pas de le faire). La seule réelle restriction étant le nombre de paramètre.

    Citation Envoyé par foetus Voir le message
    Pareil pour les opérateurs amis (friend) : cela permet de mettre l'objet pas forcément à gauche mais aussi à droite..
    Un opérateur friend n'est pas nécessaire si on n'accède pas aux membres privées, une fonction libre fait l'affaire. Après, il y a un effet assez peu connut de friend qui fait que si le compilateur ne trouve aucun opérateur correspondant ne va pas lister les opérateurs amis si aucun des types en paramètre ne correspond:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct A {
      friend A operator+(const A&, const A&) { return {}; }
    };
    inline A operator-(const A&, const A&) { return {}; }
     
    class B {};
     
    int main() {
      B() + 1; // operator+ non listé
      B() - 1; // operator- listé
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    test.cpp:9:7: error: invalid operands to binary expression ('B' and 'int')
        9 |   B() + 1; // operator+ non listé
          |   ~~~ ^ ~
    test.cpp:10:7: error: invalid operands to binary expression ('B' and 'int')
       10 |   B() - 1; // operator- listé
          |   ~~~ ^ ~
    test.cpp:4:10: note: candidate function not viable: no known conversion from 'B' to 'const A' for 1st argument
        4 | inline A operator-(const A&, const A&) { return {}; }
          |          ^         ~~~~~~~~
    2 errors generated.

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

Discussions similaires

  1. Nombre de fichiers ouverts simultanément
    Par matrixfan dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2002, 17h47
  2. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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