Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 2006
-
9 juin 2005 à 23:52
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 2010
-
26 juin 2005 à 10:18
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 26 juin 2005 à 10:18
oki merci tout plein.
malgré les 3 heures du mat' j'ai compris ^^
++
ad
Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 20062 26 juin 2005 à 02:56
C'est parti ( malgré l'heure tardive )
4. La différence entre : Image::Image() { _Taille = 0; }
et Image::Image() : _Taille( 0 ) {} ?
Imaginons que _Taille soit une variable d'une classe Taille
qui a un constructeur à partir d'un entier (et sûrement un opérateur d'affectation)
Dans le premier cas, il y aura appel au constructeur par défaut de la classe Taille puis appele à l'opérateur d'affectation.
Dans le deuxième cas, seul le constructeur à partir d'un entier sera appelé. Le permier cas revient en fait à écrire
Image::Image() : _Taille() { _Taille = 0; }
Imagine si le constructeur par défaut est un peu lourd ou fait des choses inutiles pour finalement être recalculé à partir d'une taille à 0. ( std::string est un exemple )
8. la différence entre a++ et ++a sur un itérateur.
le premier te renvoie un nouvel itérateur temporaire puis incrémente ton itérateur. le deuxième incrémente ton itérateur et t'en renvoie une référence.
Dans le premier cas, tu as une création d'itérateur qui ne te sert pas.
J'espère que ces explications te vont.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 25 juin 2005 à 22:22
-> hylvenir:
4. Tu devrais prendre le réflexe d'initialiser tes variables de classe comme suit :
Image::Image() : _Taille( 0 ) {}
et pas
Image::Image() { _Taille = 0; }
// Idem pour pour l'autre constructeur
C'est mieux pour certains objets (je ne m'étends pas).
tu pourrais t'étendre stp? je comprends pas pk tu dis ca, ce que ca change kwa.
8. Base.cpp ligne 40. Utilise ++ _Pair au lieu de _Pair ++, c'est une bonne habitude ça peut être que plus rapide.
pas d'accord, au pt de vue asm ca restera tjs "inc ma_variable"
merci pr tes commentaires...
++
ad
Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 20062 9 juin 2005 à 23:52
Salut,
alors quelques remarques dans le désordre de la lecture des sources.
1. On n'ouvre jamais un namespace dans un include
cf Image.h lign 16.
2. Un destructeur de classe non virtuel ne faisant rien... autant pas le mettre.
3. Le constructeur Image( char*, int ) devrait être en fait Image( const char*, int ) sinon un compilo moderne te fera au moins un warning sur quelque chose du genre Image img( "img.jpg", 1 );
"imp.jpg" étant un const char[] en C++.
4. Tes accesseurs devraient être const ( cf Image.getTaille )
4. Tu devrais prendre le réflexe d'initialiser tes variables de classe comme suit :
Image::Image() : _Taille( 0 ) {}
et pas
Image::Image() { _Taille = 0; }
// Idem pour pour l'autre constructeur
C'est mieux pour certains objets (je ne m'étends pas).
5. Image.cpp ligne 61. pourquoi utilises-tu compare
au lieu d'un simple == ?
6. Pour un tuto sur la STL, tu aurais pas utiliser for_each
pour ta fonction VersMinuscule.
7. Base.cpp lign 40. Tu devrais passer une référence constante de Database au lieu d'une copie probable.
8. Base.cpp ligne 40. Utilise ++ _Pair au lieu de _Pair ++, c'est une bonne habitude ça peut être que plus rapide.
9. Base.cpp ligne 89, 93. Tu pourrais ne faire qu'un appel à equal_range. genre
pair< Database::iterator, Database::iterator > found
= _Base.equal_range( ... )
if ( found.first == found.end() )
...
Voilà en gros sans trop rentrer dans les détails.
A+
26 juin 2005 à 10:18
malgré les 3 heures du mat' j'ai compris ^^
++
ad
26 juin 2005 à 02:56
4. La différence entre : Image::Image() { _Taille = 0; }
et Image::Image() : _Taille( 0 ) {} ?
Imaginons que _Taille soit une variable d'une classe Taille
qui a un constructeur à partir d'un entier (et sûrement un opérateur d'affectation)
Dans le premier cas, il y aura appel au constructeur par défaut de la classe Taille puis appele à l'opérateur d'affectation.
Dans le deuxième cas, seul le constructeur à partir d'un entier sera appelé. Le permier cas revient en fait à écrire
Image::Image() : _Taille() { _Taille = 0; }
Imagine si le constructeur par défaut est un peu lourd ou fait des choses inutiles pour finalement être recalculé à partir d'une taille à 0. ( std::string est un exemple )
8. la différence entre a++ et ++a sur un itérateur.
le premier te renvoie un nouvel itérateur temporaire puis incrémente ton itérateur. le deuxième incrémente ton itérateur et t'en renvoie une référence.
Dans le premier cas, tu as une création d'itérateur qui ne te sert pas.
J'espère que ces explications te vont.
25 juin 2005 à 22:22
4. Tu devrais prendre le réflexe d'initialiser tes variables de classe comme suit :
Image::Image() : _Taille( 0 ) {}
et pas
Image::Image() { _Taille = 0; }
// Idem pour pour l'autre constructeur
C'est mieux pour certains objets (je ne m'étends pas).
tu pourrais t'étendre stp? je comprends pas pk tu dis ca, ce que ca change kwa.
8. Base.cpp ligne 40. Utilise ++ _Pair au lieu de _Pair ++, c'est une bonne habitude ça peut être que plus rapide.
pas d'accord, au pt de vue asm ca restera tjs "inc ma_variable"
merci pr tes commentaires...
++
ad
9 juin 2005 à 23:52
alors quelques remarques dans le désordre de la lecture des sources.
1. On n'ouvre jamais un namespace dans un include
cf Image.h lign 16.
2. Un destructeur de classe non virtuel ne faisant rien... autant pas le mettre.
3. Le constructeur Image( char*, int ) devrait être en fait Image( const char*, int ) sinon un compilo moderne te fera au moins un warning sur quelque chose du genre Image img( "img.jpg", 1 );
"imp.jpg" étant un const char[] en C++.
4. Tes accesseurs devraient être const ( cf Image.getTaille )
4. Tu devrais prendre le réflexe d'initialiser tes variables de classe comme suit :
Image::Image() : _Taille( 0 ) {}
et pas
Image::Image() { _Taille = 0; }
// Idem pour pour l'autre constructeur
C'est mieux pour certains objets (je ne m'étends pas).
5. Image.cpp ligne 61. pourquoi utilises-tu compare
au lieu d'un simple == ?
6. Pour un tuto sur la STL, tu aurais pas utiliser for_each
pour ta fonction VersMinuscule.
7. Base.cpp lign 40. Tu devrais passer une référence constante de Database au lieu d'une copie probable.
8. Base.cpp ligne 40. Utilise ++ _Pair au lieu de _Pair ++, c'est une bonne habitude ça peut être que plus rapide.
9. Base.cpp ligne 89, 93. Tu pourrais ne faire qu'un appel à equal_range. genre
pair< Database::iterator, Database::iterator > found
= _Base.equal_range( ... )
if ( found.first == found.end() )
...
Voilà en gros sans trop rentrer dans les détails.
A+