opérateurs d'incrémentation : ++Taz vs. Taz++

opérateurs d'incrémentation : ++Taz vs. Taz++ - C++ - Programmation

Marsh Posté le 29-07-2003 à 00:11:00    

comme vous le savez déjà, le C++ permet la surcharge d'opérateurs. ce soir, on se penche sur l'opérateur d'incrémentation (tout ce qui sera dit ici est valable pour l'opérateur de décrémentation)
 
l'opérateur ++ existe sous 2 formes: la post et la pre incrémentation (i++ et ++i). Je ne fais pas de rappels sur l'utilisation.
 
Nous allons voir comment les surcharger et pourquoi les killers utilisent toujours quand ils le peuvent l'opérateur de pré-incrémentation.
 
pour la première partie, le code parle de lui même.
 - pré-incrémentation Taz& operator++(), pas de problème on peut renvoyer une référence à l'object
 - post-incrémentation Taz operator++(int), on revoie une copie selon la sémantique générale (le paramètre int sert uniquement à différencier les versions)
 
pour la deuxième partie: i++ est en fait une surcouche à ++i. penser à son coportement: incrémenter i et retourner son ancienne valeur, c'est donc tres facile à implémenter à partir de ++i. tout l'enjeu consiste à retourner l'ancienne valeur, il faut donc mémoriser une copie: si on en s'en sert OK, sinon quel gachis! vous allez me dire, ça ne coute rien... mais sur un objet, si. pensez aux itérateurs qui vous permettent de vous ballader à travers de (très) grandes séquences: vous ecriver i++ et à chaque fois vous créez sans le savoir un itérateur inutile. je vous rassure tout de suite, pour les types de bases, le compilateur optimise ce genre de chose. mais pour vos types persos, encore heureux qu'il fasse ce qu'on lui dit. Pensez qu'un itérateur c'est souvent 2/3 pointeurs: j'ai récemment eu l'exemple d'un iterateur pesant 12*8 octets. Les copies inutiles ça peut donc vous pénaliser, et surtout, c'est trop bête puisque c'est inutile.
 
petit exemple de code pour vous convaincre
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class Taz
  4. {
  5.   int i;
  6.  
  7.   public:
  8.  
  9.   Taz()
  10.   {
  11.     cout << "Constructeur trivial" << " &" << &i << endl;
  12.   }
  13.  
  14.   /* explicit */ Taz(int j)
  15.    : i(j)
  16.   {
  17.     cout << "Constructeur i = " << i << " &" << &i << endl;
  18.   } 
  19.  
  20.   Taz(const Taz &f)
  21.     : i(f.i)
  22.   {
  23.     cout << "Constructeur par recopie i = " << i << " &" << &i << " (source &" << &f.i << ')' << endl;
  24.   }
  25.  
  26.   ~Taz()
  27.   {
  28.     cout << "~Destructeur i = " << i << " &" << &i << endl;
  29.   } 
  30.  
  31.   Taz& operator+=(const Taz &other)
  32.   {
  33.     this->i+=other.i;
  34.     return *this;
  35.   }
  36.  
  37.   Taz& operator++()
  38.   {
  39.     cout << "pre-incrementation" << endl;
  40.     ++i;
  41.     return *this;
  42.   }
  43.   Taz operator++(int)
  44.   {
  45.     cout << "post-incrementation" << endl;
  46.     Taz temp(*this);
  47.     ++i;
  48.     cout << "Copie de retour ";
  49.     return temp;
  50.   }
  51. };
  52. int main()
  53. {
  54.   Taz a;
  55.   cout << endl;
  56.   a++;
  57.   cout << endl;
  58.   ++a;
  59.   cout << endl;
  60. }


Message édité par Taz le 06-09-2003 à 13:22:16
Reply

Marsh Posté le 29-07-2003 à 00:11:00   

Reply

Marsh Posté le 29-07-2003 à 00:52:56    

d'ou le ++Taz.
 
D'ailleurs il est ou ton ++pseudo ?


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 29-07-2003 à 00:55:44    

JagStang a écrit :

d'ou le ++Taz.
 
D'ailleurs il est ou ton ++pseudo ?

parti (mass rename) par ce qu'être modo avec des ++ pose un problème


Message édité par Taz le 29-07-2003 à 00:56:13
Reply

Marsh Posté le 29-07-2003 à 01:04:02    

je me disais bien...
 
Merci pour tes récentes contributions en tout cas


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 29-07-2003 à 07:53:04    

Très intéressant!!
J'ai déjà lu qu'il valait mieux utiliser ++i que i++, mais sans explication ca me paraissait un peu magique...
Je suppose que sur une boucle à la con

Code :
  1. for(int i = 0; i < MAX; i++)


 
on ne gagne pas énormément, tout de même... :??:

Reply

Marsh Posté le 29-07-2003 à 08:00:24    

Tu gagnes rien avec les types de bases, t'sais pas lire !?

Reply

Marsh Posté le 29-07-2003 à 08:05:19    

*Syl* a écrit :

Tu gagnes rien avec les types de bases, t'sais pas lire !?


Il est encore tôt... :sleep:  [:skeye]

Reply

Marsh Posté le 06-09-2003 à 13:16:58    

merci bcp pour cette explication encore  :jap:


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 06-09-2003 à 13:48:11    

Je vais bientôt pouvoir jeter mon vieux bouquin de C++, tout le contenu sera ici bientôt :D
 
merci :jap:

Reply

Marsh Posté le 06-09-2003 à 13:56:05    

drasche a écrit :

Je vais bientôt pouvoir jeter mon vieux bouquin de C++, tout le contenu sera ici bientôt :D
 
merci :jap:

si quelqu'un me propose un système à la blog pour écrire ça un peu plus joli et faire une bonne mise en forme, faire un petit répertoire d'articles, par ce que sur le forum, tout disparait. ou alors faut que je garde des liens vers tout ça dans ma signature en permanence
 
edit: et puis non j'ai pas envie de retaper. si les gens sont intéressés, ils feront une recherche.


Message édité par Taz le 06-09-2003 à 14:04:47
Reply

Marsh Posté le 06-09-2003 à 13:56:05   

Reply

Marsh Posté le 06-09-2003 à 16:10:32    

t'as quà faire une FAQ C++ ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 06-09-2003 à 16:19:15    

ben non. je réponds pas à des questions courantes, j'aime le principe de petit article découverte

Reply

Marsh Posté le 06-09-2003 à 16:39:37    

Reply

Marsh Posté le 06-09-2003 à 18:22:45    

Taz a écrit :

si quelqu'un me propose un système à la blog pour écrire ça un peu plus joli et faire une bonne mise en forme, faire un petit répertoire d'articles, par ce que sur le forum, tout disparait. ou alors faut que je garde des liens vers tout ça dans ma signature en permanence
 
edit: et puis non j'ai pas envie de retaper. si les gens sont intéressés, ils feront une recherche.


 
Un truc comme un wiki ? Ca permet des discutions comme sur un forum mais ça classe les articles par mot clefs et non pas par date.

Reply

Marsh Posté le 06-09-2003 à 18:26:58    

ouais pourquoi pas
 
pour tout ce qui ne concerne pas ce topic ->
http://forum.hardware.fr/forum2.ph [...] 234&cat=10
 
(je nettoirais dans quelques jours)


Message édité par Taz le 06-09-2003 à 18:34:31
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed