OVH Cloud OVH Cloud

(newbie) arguments const reférence

5 réponses
Avatar
meow
Bonjour,

J'ai beaucoup de mal =E0 comprendre comment =E7a fonctionne... Si j'ai
bien tout compris, on emploie const pour signifier que l'objet pass=E9
par r=E9f=E9rence ne sera pas modifi=E9 par la fonction, qu'il s'agit
juste d'un souci d'optimisation.
X f(const Y& y) : y ne sera pas modifi=E9 apr=E8s le retour de f

Dans le bout de code ci dessous, dans la fonction f je ne modifies pas
a et pourtant le const n'est appr=E9ci=E9 sur aucune des deux lignes de
la fonction.


class A
{
int a;
public:
A(int x=3D0,int y=3D0):a(x){;};
int geta(){return a;};
void seta(int x){a=3Dx;};
};

int f (const A& a, A& b)
{
b.seta(a.geta());
return a.geta();
}

5 réponses

Avatar
Jean-Marc Bourguet
"meow" writes:

Bonjour,

J'ai beaucoup de mal à comprendre comment ça fonctionne... Si j'ai
bien tout compris, on emploie const pour signifier que l'objet passé
par référence ne sera pas modifié par la fonction, qu'il s'agit
juste d'un souci d'optimisation.
X f(const Y& y) : y ne sera pas modifié après le retour de f

Dans le bout de code ci dessous, dans la fonction f je ne modifies pas
a et pourtant le const n'est apprécié sur aucune des deux lignes de
la fonction.


class A
{
int a;
public:
A(int x=0,int y=0):a(x){;};
int geta(){return a;};
void seta(int x){a=x;};
};


Il faut indiquer que geta ne modifie pas l'objet

int geta() const { return a; }

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
meow
dit comme ça, ça parrait évident :) merci !

juste pour etre cerain d'avoir pigé : ta réponse signifie que
1. le compilo ne s'amuse pas à regarder si toutes les fonctions
modifient ou non la classe, il ne le fait que pour celles sur
lesquelles on a un "contrat const" comme tu l'as indiqué.
2. une fonction qui a un argument const ref ne peut utiliser que les
méthodes de cet objet qui ont eu le bon gout de poser un "contrat
const".
Avatar
Michel Michaud
Dans le message ,
dit comme ça, ça parrait évident :) merci !

juste pour etre cerain d'avoir pigé : ta réponse signifie que
1. le compilo ne s'amuse pas à regarder si toutes les fonctions
modifient ou non la classe, il ne le fait que pour celles sur
lesquelles on a un "contrat const" comme tu l'as indiqué.


Même s'il le voulait, il ne pourrait pas. Une fonction peut
être déclarée sans être définie et le compilateur peut compiler
du code qui appelle cette fonction avant qu'elle ne soit définie.

2. une fonction qui a un argument const ref ne peut utiliser que les
méthodes de cet objet qui ont eu le bon gout de poser un "contrat
const".


En C++, ce n'est pas une question de goût, il faut que l'on déclare
const les fonctions qui ne modifient pas l'objet (sauf membre
mutable) si l'on veut pouvoir utiliser const ailleurs.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Jean-Marc Bourguet
"meow" writes:

dit comme ça, ça parrait évident :) merci !

juste pour etre cerain d'avoir pigé : ta réponse signifie que
1. le compilo ne s'amuse pas à regarder si toutes les fonctions
modifient ou non la classe, il ne le fait que pour celles sur
lesquelles on a un "contrat const" comme tu l'as indiqué.


Non seulement il ne s'amuse pas a le faire, mais il n'en a parfois pas
la possibilite quand le code est separe en differents fichiers.

2. une fonction qui a un argument const ref ne peut utiliser que les
méthodes de cet objet qui ont eu le bon gout de poser un "contrat
const".


Gagne.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
meow
Ok, oui, dit comme ça c'est vraiment logique. Je ne connais pas les
mécanismes de compilation, mais avec la petite intuition que j'en ai
j'arrive à recoller les morceaux.
merci grandement pour toutes ces réponses.