'const' a quoi sert ca sert dans une fonction

'const' a quoi sert ca sert dans une fonction - C++ - Programmation

Marsh Posté le 27-06-2003 à 00:56:54    

par ex :
 
 

Code :
  1. void saisie(istream& )const;


 
 
j'ai essaye sans et avec c la meme chose
 
 [:yamusha]


Message édité par red faction le 27-06-2003 à 00:59:03
Reply

Marsh Posté le 27-06-2003 à 00:56:54   

Reply

Marsh Posté le 27-06-2003 à 01:05:16    

Cela sert à indiquer que ta fonction ne va pas modifier ta classe.
C'est à dire que tu pourras faire ça :

Code :
  1. class Foo
  2. {
  3. void Bar() const;
  4. };
  5. int main( int argc, char *argv[] )
  6. {
  7. const Foo f;
  8. f.Bar();
  9. return 0;
  10. }


 
Si ta fonction n'était pas déclarée const, tu ne pourrais pas l'appeler.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 27-06-2003 à 01:29:17    

ouais mais si bouge le const des deux cote ca marche non ????
 
 

Code :
  1. class Foo
  2.   {
  3.     void Bar();
  4.   };
  5.  
  6.   int main( int argc, char *argv[] )
  7.   {
  8.     Foo f;
  9.     f.Bar();
  10.     return 0;
  11.   }


 
 
jvois pas trop linterer surtout que je le vois souvent avec des fct virtuelle pures

Reply

Marsh Posté le 27-06-2003 à 01:45:22    

ouais bon j'ai rien dit

Reply

Marsh Posté le 27-06-2003 à 02:28:59    

Pour enfoncer le clou, c'est pour des fonctions de consultation de l'objet, on matte mais on touche pas. A noter que cette interdiction de toucher est absolue ce qui veut dire que si le résultat a été calculé, il ne peut être mis en cache dans l'objet même si la modif n'aurait pas été visible depuis l'extérieur.
 
Voir la programmation par contrats et Eiffel pour un système plus fin où l'on dit : "je ne fait aucune modification visible de l'extérieur" mais où on peut modifier la partie invisible de l'objet (comme par exemple mettre un résultat calculé dans un cache). Bien entendu on peut aussi s'engager à ne pas non plus toucher à l'état interne.

Reply

Marsh Posté le 27-06-2003 à 11:24:38    

Bah je parierais que ce const comme les autres ne protège rien..
 

Code :
  1. class Foo
  2. {
  3. void Bar() const;
  4. };
  5. int main( int argc, char *argv[] )
  6. {
  7. Foo f;
  8. const Foo* _cf=(const Foo*)&f;
  9. _cf->Bar();
  10. return 0;
  11. }


Oui effectivement ça marche!! ;)


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 27-06-2003 à 11:26:36    

H4dd3R a écrit :

Bah je parierais que ce const comme les autres ne protège rien..
 

Code :
  1. class Foo
  2. {
  3. void Bar() const;
  4. };
  5. int main( int argc, char *argv[] )
  6. {
  7. Foo f;
  8. const Foo* _cf=(const Foo*)&f;
  9. _cf->Bar();
  10. return 0;
  11. }


Oui effectivement ça marche!! ;)


 
C sensé prouver quoi?


---------------
Le Tyran
Reply

Marsh Posté le 27-06-2003 à 11:27:20    

H4dd3R a écrit :

Bah je parierais que ce const comme les autres ne protège rien..
 

Code :
  1. class Foo
  2. {
  3. void Bar() const;
  4. };
  5. int main( int argc, char *argv[] )
  6. {
  7. Foo f;
  8. const Foo* _cf=(const Foo*)&f;
  9. _cf->Bar();
  10. return 0;
  11. }


Oui effectivement ça marche!! ;)


 
super ton cast :D

Reply

Marsh Posté le 27-06-2003 à 11:29:24    

LetoII a écrit :

C sensé prouver quoi?


Ben que définir une fct const n'empêchera jamais un utilisateur de ta classe de l'appeler depuis un objet non const..


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 27-06-2003 à 11:31:46    

H4dd3R a écrit :


Ben que définir une fct const n'empêchera jamais un utilisateur de ta classe de l'appeler depuis un objet non const..


gni ?

Reply

Marsh Posté le 27-06-2003 à 11:31:46   

Reply

Marsh Posté le 27-06-2003 à 11:33:12    

H4dd3R a écrit :


Ben que définir une fct const n'empêchera jamais un utilisateur de ta classe de l'appeler depuis un objet non const..


 
 [:fuel]  
C ne pas définir une fonction comme const qui empéche de l'appeler depuis un objet const.


Message édité par LetoII le 27-06-2003 à 11:37:45

---------------
Le Tyran
Reply

Marsh Posté le 27-06-2003 à 11:48:18    

j'ai pas tout lu, mais me semble qu'y a une autre utilité au const placé la :
 

Code :
  1. class A
  2. {
  3. public:
  4.   int m_truc;
  5.   void fct(int i) const { m_truc = i; } // ne compile pas a cause du const
  6. }


 
a mon avis c'est la principale utilité du const placé ici, empecher la fct de modifier des membres de la classe.

Reply

Marsh Posté le 27-06-2003 à 11:51:21    

Konar a écrit :

j'ai pas tout lu, mais me semble qu'y a une autre utilité au const placé la :
 

Code :
  1. class A
  2. {
  3. public:
  4.   int m_truc;
  5.   void fct(int i) const { m_truc = i; } // ne compile pas a cause du const
  6. }


 
a mon avis c'est la principale utilité du const placé ici, empecher la fct de modifier des membres de la classe.


 
Ben c innérant au concept de fonction const  [:spamafote]  
On modifie pas l'object dans une méthode const, donc c les seules méthodes applicable à un objet const.


---------------
Le Tyran
Reply

Marsh Posté le 27-06-2003 à 11:52:39    

LetoII a écrit :


 
Ben c innérant au concept de fonction const  [:spamafote]  
On modifie pas l'object dans une méthode const, donc c les seules méthodes applicable à un objet const.


 
ouais mais avec cette approche, l'autre pourra pas contourner le const avec un cast a la con, et dire que ca sert a rien les const.
 
les const c'est la vie !

Reply

Marsh Posté le 27-06-2003 à 11:54:06    

Konar a écrit :


 
ouais mais avec cette approche, l'autre pourra pas contourner le const avec un cast a la con, et dire que ca sert a rien les const.
 
les const c'est la vie !


 
Ben il contournait rien du tout [:spamafote]


---------------
Le Tyran
Reply

Marsh Posté le 27-06-2003 à 11:59:04    

:lol:
 
Bon ces koi ces gens qui poste n'importe quoi, sans avoir révisé avant ??
(comment ca je fais pareil des fois :ange: )
 
 :lol:  [:666rip666] trop fort ces quiprocos (oui je sais pas l'écrire, et alors :o ) !!


---------------
get amaroK plugin
Reply

Marsh Posté le 27-06-2003 à 12:01:27    

LetoII a écrit :


Ben il contournait rien du tout [:spamafote]  


Prenons un exemple concret.. :)
 
Tu es créateur d'une classe et moi utilisateur de cette classe.
Montres moi ce que tui penses protéger ds ta classe avec un const, et je verrai si je peux passer outre, en tant qu'utilisateur qui instancie ta classe..
 
En gros j'ai tjrs jamais vu un cas ou un const avait la moindre utilité.. Alors si on peut m'en montrer un..  :hello:


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 27-06-2003 à 12:06:58    

H4dd3R a écrit :


Prenons un exemple concret.. :)
 
Tu es créateur d'une classe et moi utilisateur de cette classe.
Montres moi ce que tui penses protéger ds ta classe avec un const, et je verrai si je peux passer outre, en tant qu'utilisateur qui instancie ta classe..
 
En gros j'ai tjrs jamais vu un cas ou un const avait la moindre utilité.. Alors si on peut m'en montrer un..  :hello:  


 
pour reprendre ton exemeple, je suis créateur d'une classe, toi utilisateur. j'ai pas envie que tu modifies certains membres, paske j'estimes que t'en a pas besoin. je met donc des const la ou il faut. tu fais des cast débiles de partout pour avoir finalement acces a ces membres. au final le proj a des ratances, apres 2 semaines on se rend compte que c'est ta faute, de ton utilisation maladroite de certains membres. tout le monde te remercie, et te dit au revoir a jamais.

Reply

Marsh Posté le 27-06-2003 à 12:14:02    

Konar a écrit :

pour reprendre ton exemeple, je suis créateur d'une classe, toi utilisateur. j'ai pas envie que tu modifies certains membres, paske j'estimes que t'en a pas besoin. je met donc des const la ou il faut. tu fais des cast débiles de partout pour avoir finalement acces a ces membres. au final le proj a des ratances, apres 2 semaines on se rend compte que c'est ta faute, de ton utilisation maladroite de certains membres. tout le monde te remercie, et te dit au revoir a jamais.


Non je dois reconnaitre ma mauvaise foi.. Le const sert à prévenir d'utilisateur de la classe que son auteur ne souhaite pas qu'il change tel ou tel morceau..
Je trouve par contre abusif de dire que le const empêche ou protège l'accès (et pourtant on trouve ça ds la doc)..
De même je trouve risqué de la part du concepteur de la classe de considérer que l'utilisateur ne pourra pas faire de modifs..
 
Sans rancune..  :)


Message édité par H4dd3R le 27-06-2003 à 12:15:41

---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 27-06-2003 à 12:25:04    

H4dd3R a écrit :


De même je trouve risqué de la part du concepteur de la classe de considérer que l'utilisateur ne pourra pas faire de modifs..


 
Il faut faire cette hypothese... parce que sinon tu peux supposer pleins de trucs contre lesquels tu ne peux rien... Tu peux toujours  modifier la mémoire comme un porc aussi...

Reply

Marsh Posté le 27-06-2003 à 12:47:02    

H4dd3R a écrit :


 
En gros j'ai tjrs jamais vu un cas ou un const avait la moindre utilité.. Alors si on peut m'en montrer un..  :hello:  


 
Tu fais un cast "à la C" dans du C++, t'arriveras toujours à trouver des failles  :sarcastic:

Reply

Marsh Posté le 27-06-2003 à 12:51:07    

Iblis666 a écrit :


 
Tu fais un cast "à la C" dans du C++, t'arriveras toujours à trouver des failles  :sarcastic:  


 

Code :
  1. class toto
  2. {
  3. public:
  4. toto();
  5. virtual ~toto();
  6. private:
  7. int a;
  8. };
  9. void main
  10. {
  11. toto truc;
  12. int * c = ((int *)&truc )+ 1 ;
  13. *c = 20;
  14. }


c'est nul le private ca protege rien :O

Reply

Marsh Posté le 27-06-2003 à 12:58:37    

H4dd3R a écrit :


Prenons un exemple concret.. :)
 
Tu es créateur d'une classe et moi utilisateur de cette classe.
Montres moi ce que tui penses protéger ds ta classe avec un const, et je verrai si je peux passer outre, en tant qu'utilisateur qui instancie ta classe..
 
En gros j'ai tjrs jamais vu un cas ou un const avait la moindre utilité.. Alors si on peut m'en montrer un..  :hello:  


 
C pas une question de protection c une question de conception. Pour que les choses se passent bien dans le programme faut que ça marche comme ça, si tu passe outre c à tes risques est périles [:spamafote]


Message édité par LetoII le 27-06-2003 à 13:00:49

---------------
Le Tyran
Reply

Marsh Posté le 27-06-2003 à 12:59:34    

LetoII a écrit :


 
C pas une question de protection c une question de protection.  


 
[:gratgrat] [:meganne]

Reply

Marsh Posté le 27-06-2003 à 13:01:19    


 
Bon arréte de modiifer le texte quand tu quote  :whistle:


---------------
Le Tyran
Reply

Marsh Posté le 27-06-2003 à 13:05:24    

LetoII a écrit :


 
Bon arréte de modiifer le texte quand tu quote  :whistle:  


 
Désmaqué  :lol:

Reply

Marsh Posté le 27-06-2003 à 13:07:23    

chrisbk a écrit :


c'est nul le private ca protege rien :O
 


 
très bon :D  
Par contre "spa portable" comme dirait l'autre taze :o
 


Message édité par Iblis666 le 27-06-2003 à 13:26:03
Reply

Marsh Posté le 27-06-2003 à 22:15:05    

le const ce n'est pas une protection  
c'est une aide de programmation
comme private, comme l'heritage, les
destructeurs virtuels etc..
si tu es trop con pour ne pas savoir comment
l'utiliser ne l'utilise pas..
(rque pour Hadder)
 
un objet peut tres bien etre accede en const d'un cote et ne pas etre const de l'autre.
 
Comme ici:

Code :
  1. class foo
  2. {
  3.    void bar(const &foo);
  4. }
  5. foo toto;
  6. toto.bar(toto);


 
Ce n'est pas le probleme.
Evidemment vouloir utiliser des const sans devoir
utiliser un const_cast a tout bout de champ
ca demande de se casser un peu plus la tete pour designer
un programme mais c'est a ça que ça sert (se casser la tete pour au final avoir un meilleur design un programme qui marche presque du premier coup (ca par contre ce n'est pas gagné) ).
 
pour nraynaud et sa remarque sur le cache:
c'est à ça que sert le mot clé mutable.
 
LeGreg

Reply

Marsh Posté le 27-06-2003 à 22:32:37    

legreg a écrit :


pour nraynaud et sa remarque sur le cache:
c'est à ça que sert le mot clé mutable.


Effectivement, je connaissais pas.
http://msdn.microsoft.com/library/ [...] frame=true
 
Par contre c'est portes ouverte, n'importe qui (enfin, n'importe quelle méthode) fait n'importe quoi sur un mutable.  
Ça reste grossier (bien que moins que ce que je pensais) face à un contrat.

Reply

Marsh Posté le 30-06-2003 à 10:49:43    

legreg a écrit :

le const ce n'est pas une protection  
c'est une aide de programmation
comme private, comme l'heritage, les
destructeurs virtuels etc..
si tu es trop con pour ne pas savoir comment
l'utiliser ne l'utilise pas..
(rque pour Hadder)


Merci..


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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