paramètre "const"

paramètre "const" - C++ - Programmation

Marsh Posté le 26-05-2006 à 11:11:22    

Bonjour

 

Je suis en train d'apprendre le langage C++ (j'avais jusqu'ici surtout fait du java) et j'ai un petit souci de compréhension avec les paramètres "const" d'une méthode

 

Dans une classe "Point3D" j'ai trois membre private x,y,z de type double. J'ai aussi la méthode "void translate (const Vector3D & v)

 
Code :
  1. void
  2. Point3D::translate (const Vector3D& v)
  3. {
  4.     x += v.getX();
  5.     y += v.getY();
  6.     z += v.getZ();
  7. }
 


Le compilateur m'indique une erreur :

 

2    error: passing `const Vector3D' as `this' argument of `double Vector3D::getX()' discards qualifiers    Point3D.cpp    ccollisionstest    line 125  

 

Par contre si je supprime le "const", l'erreur disparaît. J'avais crû comprendre que le mot clé "const" signifiait que le paramètre n'était pas modifié, ce qui est mon cas. Pouvez-vous s.v.p. éclairer ma lanterne ?

 

D'avance merci

 

P.S. Je ne sais pas si cela à de l'importance, mais mon compilateur est gcc 3.3.5 sous linux.

 

Reply

Marsh Posté le 26-05-2006 à 11:11:22   

Reply

Marsh Posté le 26-05-2006 à 11:21:02    

const, est équivalent de final en java.
donc, tu ne peut pas modifier (affectations: = += *= ...) une variable <<const>>, seulement l'initialiser (passage de paramètre) et la lire.

Reply

Marsh Posté le 26-05-2006 à 11:23:11    

ha oui, les fonctions peuvent être <<const>>.
ex:
int getX() const;
-> renvoie la composante X, ne modifie pas l'objet vecteur.
 
Il doit te manquer le <<const>> sur les fonctions getX, getY et getZ, pour indiquer que ces fonctions ne modifient pas l'objet vecteur sur lesquelles elles travaillent.

Reply

Marsh Posté le 26-05-2006 à 11:24:26    

c'est justement ce que j'avais compris. Mais les méthodes getX(), getY() et getZ() ne font que lire la valeur du membre x de la classe Vector3D... donc cette valeur n'est pas modifiée il me semble... Manifestement il y a encore des mystères au royaume de C++  :pt1cable:  
 
Merci de ton explication

Reply

Marsh Posté le 26-05-2006 à 11:25:38    

getX(), getY(), etc de Vector3D sont t'elles en const ?
 

Code :
  1. int Vector3D::getX() const {
  2. // blabla
  3. }


 
Mettre un const sur l'obj indique que l'appel a la fonction ne le modifie pas.
 
Dans ton cas, tu appel des fonctions non const, donc qui modifie l'obj, sur un objet constant, d'ou l'erreur
 
 
edit : toasted


Message édité par zapan666 le 26-05-2006 à 11:26:19

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 26-05-2006 à 11:30:09    

non, elle n'est pas modifiée, mais tu doit quand même indiquer que ces fonctions sont <<const>>.
 
Ce qu'il se passe, c'est que en C++, la définition des fonction, et le corps, peuvent être définis dans différents fichiers. Celà permet de faire une interface de programmation (définition des appels de fonctions) sans avoir à fournir d'emblé le code. (ça pourrait ressembler à une interface...)
 
Ansi, tu est obligé d'indiquer lorsqu'une fonction ne modifie pas l'objet.
 
ex:

Code :
  1. class Vector ...
  2.   int getX() const; // définition de l'appel
  3. // plus loin, ou dans un autre fichier:
  4. int Vector::getX() const
  5. { return x; } // corps de la fonction


Tu peut alors utiliser la fonction getX() sans connaître le code associé. Celà permet d'associer un code après la définition de la fonction, par exemple lors de l'édition de lien, ou lors de l'utilisation d'une librairie.

Reply

Marsh Posté le 26-05-2006 à 12:00:45    

Citation :

Ce qu'il se passe, c'est que en C++, la définition des fonction, et le corps, peuvent être définis dans différents fichiers.


 
oui mais c'est pas ca l'explication, une methode d'objet recoit toujours en parametre "caché" l'objet sur lequel elle s'applique appelé this dans la méthode. C'est comme si elle recevait un 'object * const this'  (this contient l'adresse d'un 'object') en parametre, et quand tu la specifies const ca serait un 'object const * const this' (this contient l'adresse d'un 'object const'. Apres c'est la logique, la conversion 'object const' -> 'object' est interdite

Reply

Marsh Posté le 26-05-2006 à 12:22:44    

Oki, effectivement je n'avais pas vu le "truc" de la fonction const. En bon petit programmeur Java, j'avais imaginé "const == final", mais pour les méthodes ça a effectivement une autre signification...  
 
Merci de vos lumières...  

Reply

Sujets relatifs:

Leave a Replay

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