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 :

question sur la surcharge d'opérateur ++


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 question sur la surcharge d'opérateur ++
    J'ai une question concernant la surdéfinition des opérateur pour les itérateurs.
    Dans le code du header <iterator> de la STL, à la ligne 46, on a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	_Myt& operator++()
    		{	// pretend to preincrement
    		return (*this);
    		}
     
    	_Myt operator++(int)
    		{	// pretend to postincrement
    		return (*this);
    		}
    Je ne comprends pas du tout le fonctionnement du deuxième opérateur. Surtout, a quoi correspond et sert le (int)? il s'agit d'une fonction, mais elle ne possède pas d'argument. Il y a juste la déclaration du type.

    Enfin, pourquoi la préincrémentation renvoie une référence, alors que la posteincrémentation renvoie une valeur?



    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    En C et C++,il n'est pas obligatoire de nommer les arguments que l'on n'utilise(on doit juste donner leur type). L'argument int sert (au compilateur) à differencier post- et pre- incrementation. Enfin le renvoi d'une reference et d'une valeur est,ici, une question de sémantique : la préincremntation incremente l'objet et le renvoie, alors que la postincrementation incremente l'objet et renvoie une copie de l'objet avant l'incrementation. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int i = 0;
    ++(++i) // i == 2
    (i++)++ // i == 3 equivalent de int tmp = i; i+=1; tmp++;
    Mais là, vu que ce sont sans doute de faux iterateur(dans le sens ou ils n'itèrent) comme back_inserter, la difference n'est pas très visible.

  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
    oui, mais quand on fait quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     std::vector<double> T;
    	 T.push_back(1);T.push_back(2);T.push_back(3);T.push_back(4);
    	 std::back_insert_iterator<std::vector<double>> p(T),q(T);
    	  p++;
    	  ++p;
    on est d'accord que dans l'appel p++, on fait appel à la post-incrémentation.
    En fait, cela revient à faire:

    Mais dans ce cas, comment faire la différence entre la post incrémentation, et la pré-incrémentation.

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 551
    Par défaut
    p.operator++() : préincrément
    p.operator++(0) : postincrément

    Citation Envoyé par deubelte Voir le message
    Mais dans ce cas, comment faire la différence entre la post incrémentation, et la pré-incrémentation.
    que voulez-vous dire ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    que voulez-vous dire ?
    Vous avez répondu à ma question.

  6. #6
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    En fait, dans le meilleur des mondes, on aurait probablement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    T& ++operator();
    T operator++();
    Mais j'imagine que ça n'a pas été retenue par le comité car cela compliquerait horriblement le boulot des parseurs uniquement pour supporter le cas particulier de la préincrémentation.

    Donc il a été choisi de différencier les deux opérateurs uniquement par la signature, avec aucun argument pour la préincrémentation et un int pour la postincrémentation.

Discussions similaires

  1. Question sur la surcharge de constructeur avec enum ?
    Par LiTiL_DiViL dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 05/04/2013, 12h53
  2. Question sur la surcharge buffer
    Par sivaller dans le forum OpenGL
    Réponses: 1
    Dernier message: 04/04/2008, 00h02
  3. [debutant] question sur la surcharge des operateurs
    Par hunter99 dans le forum Débuter
    Réponses: 17
    Dernier message: 04/01/2008, 18h26
  4. Questions sur l'opérateur <<
    Par coyotte507 dans le forum C++
    Réponses: 4
    Dernier message: 18/11/2007, 22h54
  5. question sur les opérateurs
    Par isidore dans le forum C++
    Réponses: 10
    Dernier message: 25/02/2005, 18h46

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