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

  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 769
    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 769
    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.

  7. #7
    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
    Merci pour ces précisions

    j'ai essayé d'enchaîner les additions et les affectations sans le & et ça marche aussi. (?)

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Oui ça marche, tu retournes une copie, copie utilisée pour être assignée au suivant.
    Copie qui doit aussi être construite, puis détruite.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    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
    mais alors à quoi sert le & dans le type de retour?

  10. #10
    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
    Citation Envoyé par emmesse Voir le message
    mais alors à quoi sert le & dans le type de retour?
    Réponse courte, ici il faut le mettre.

    Réponse plus longue, il faut relire tout ce qui a été écrit ici.

  11. #11
    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
    je ne peux donc pas ici, comme n est un objet local?
    comment utiliser ici un retour qui n'est pas une variable locale?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nombre nombre::operator-()const{
      nombre n;
      n.positif= ! positif;
      n.partie_entiere=partie_entiere;
      n.partie_decimale=partie_decimale;
      return n;
    }

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #13
    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
    si j'ai bien compris ce tableau, la référence de sortie ne se fait que avec = += -= /= *= ...
    les opérateurs ou les méthodes qui modifient l'objet courant et qui renvoient *this?

  14. #14
    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
    Citation Envoyé par emmesse Voir le message
    je ne peux donc pas ici, comme n est un objet local?
    comment utiliser ici un retour qui n'est pas une variable locale?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nombre nombre::operator-()const{
      nombre n;
      n.positif= ! positif;
      n.partie_entiere=partie_entiere;
      n.partie_decimale=partie_decimale;
      return n;
    }
    Ton code est correct. L'opérateur- doit fabriquer une valeur, et donc c'est bien une valeur qu'il faut retourner, surtout pas une référence.
    On ne retourne une référence que pour les fonctions et opérateurs qui doivent désigner une instance qui existait avant l'appel. Exemple des opérateurs dont le retour est une désignation (d'où référence):
    • l'opérateur d'assignation=, retourne une référence à *this.
    • les opérateurs d'assignation avec opération@=, retournent une référence à *this.
    • les opérateurs pré++ et pré--, retournent une référence à *this.
    • l'opérateur[], retourne une référence à l'élément auquel on désire accéder.
    • l'opérateur de déréférencement*, retourne une référence à l'élément auquel on désire accéder.
    • l'opérateur d'accès par pointeur membre->*, retourne une référence à l'élément auquel on désire accéder.
    Pour les trois premiers, on pourrait mettre void en retour, cela bloquerait des expressions complexes telles que a = b = c; ou ++ ++a;.
    Pour les trois derniers, la référence est plus vitale, on doit avoir en retour une référence. Par exemple pour t[i] = c;, le t[i] ne peut pas être une instance fabriquée, ça doit donner un moyen d'accéder à une partie de l'instance t.
    Pour les trois derniers, ils peuvent aussi s'appliquer à un objet constant, ça peut alors retourner une instance. Comme modifier n'est pas possible, le retour est une référence constante (on désigne l'original intouchable) ou une instance fabriquée (une copie de l'original).

  15. #15
    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
    merci pour ces précisions

+ 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