OVH Cloud OVH Cloud

const ?

7 réponses
Avatar
BuG
Bonjour je ne comprends pas trés bien à quoi sert "const" dans une
déclaration de fonction de ce genre :

foo(const matrice &m);

la fonction foo prends comme argument une variable de type matrice qu'on
passe par référence, mais le const signifie quoi exactement ? qu'on modifie
la matrice m mais à la fin de la fonction foo, les modifications sont
oubliées ?
C'est equivalent à foo(matrice m) ?

Merci

Gib

7 réponses

Avatar
Alexandre
bonjour,

"BuG" a écrit dans le message de
news:c8c9cu$t6s$
Bonjour je ne comprends pas trés bien à quoi sert "const" dans une
déclaration de fonction de ce genre :

foo(const matrice &m);

la fonction foo prends comme argument une variable de type matrice qu'on
passe par référence, mais le const signifie quoi exactement ? qu'on
modifie

la matrice m mais à la fin de la fonction foo, les modifications sont
oubliées ?
C'est equivalent à foo(matrice m) ?


le const sert à préciser que m ne sera pas modifié. Une modification de m à
l'intérieur de la fonction ne compilera pas. Donc tu t'assures que m ne
changera pas. Ce qui permet d'appeler la fonction avec des instances
constantes. Par exemple :

foo(matrice& m){....} // pas de const mais foo ne modifie pas m

const matrice MC;
foo(MC); // ne compile pas alors que m ne changeant pas dans foo, ce
n'est pas grave

foo(const matrice& m){...}
const matrice MC;
foo(MC); // ici pas de pb

la référence constante n'est pas strictement équivalente à une valeur (const
matrice& != matrice) car il n'y a aucune copie de l'objet passé en paramètre
dans le 1er cas, mais en pratique ça revient au ^même

Avatar
Jean-Marc Bourguet
"Alexandre" writes:

la référence constante n'est pas strictement équivalente à une valeur (const
matrice& != matrice) car il n'y a aucune copie de l'objet passé en paramètre
dans le 1er cas, mais en pratique ça revient au ^même


int global;

void bar() {
global = 42;
}

int foo(int const& x) {
bar();
return x;
}

...
global = 0;
assert(foo(global) == 42);

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
Fabien LE LEZ
On 18 May 2004 20:54:38 +0200, Jean-Marc Bourguet
wrote:

"Alexandre" writes:
dans le 1er cas, mais en pratique ça revient au ^même



[snip le contre-exemple]

Euh... j'espère qu'"en pratique", i.e. dans du vrai code (de
production), tu ne vois pas ce genre de truc ;-)

--
;-)
FLL, Epagneul Breton


Avatar
drkm
Jean-Marc Bourguet writes:

"Alexandre" writes:

la référence constante n'est pas strictement équivalente à une valeur (const
matrice& != matrice) car il n'y a aucune copie de l'objet passé en paramètre
dans le 1er cas, mais en pratique ça revient au ^même


int global;

void bar() {
global = 42;
}

int foo(int const& x) {
bar();
return x;
}

...
global = 0;
assert(foo(global) == 42);


Heu, je ne vois pas vraiment où tu veux en venir.

--drkm


Avatar
Fabien LE LEZ
On Wed, 19 May 2004 01:55:39 +0200, drkm
wrote:

Heu, je ne vois pas vraiment où tu veux en venir.


Le résultat serait différent s'il avait écrit

int foo (int const x)

--
;-)
FLL, Epagneul Breton

Avatar
Jean-Marc Bourguet
Fabien LE LEZ writes:

On 18 May 2004 20:54:38 +0200, Jean-Marc Bourguet
wrote:

"Alexandre" writes:
dans le 1er cas, mais en pratique ça revient au ^même



[snip le contre-exemple]

Euh... j'espère qu'"en pratique", i.e. dans du vrai code (de
production), tu ne vois pas ce genre de truc ;-)


En pratique, je vois des problemes d'alias (plutot d'ailleurs avec des
pointeurs que des references -- surtout que que je viens de passer sur
une partie du projet ecrite en C, mais qui compilera en C++ dans la
version qui suit celle qui va partir en production bientot avec pour
objectif d'utiliser du C++, ah travailler sur des fichiers modifie la
derniere fois en 94 ...). Malheureusement souvent mieux cache que
celui que j'ai montre.

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
drkm
Fabien LE LEZ writes:

On Wed, 19 May 2004 01:55:39 +0200, drkm
^^^^^^^^

wrote:

Heu, je ne vois pas vraiment où tu veux en venir.


Le résultat serait différent s'il avait écrit

int foo (int const x)


Il était encore tôt pourtant ;-(. Merci.

--drkm