J'ai réussi à modifier des objets const !!

Fermé
pom - 21 juin 2004 à 11:37
 rubenlebigboss - 30 déc. 2009 à 01:38
Bonjour, ce WE j'ai réussi à modifier des objets const (en C++ je précise). Je suis très étonné. Je voulais faire une fonction gauss pour résoudre le système linéaire Ax=b (étant donné que je veux continuer à apprendre le C++, je ne voulais pas repiquer une fonction déjà faite sur le net, car je pense que pour apprendre, il faut que je mette la main à la pâte).
Je me suis donc fait une classe Matrice (pour moi, un vecteur est une Matrice a une seule colonne, je n'ai donc pas codé de classe vecteur). Voici le début de ma fonction gauss

Matrice gauss(const Matrice & A, const Matrice & b)
{
il y a tout plein d'assert qui verifient tout plein de choses puis

Matrice A_=A, b_=b; // car dans gauss on modifie les matrices A et b (du fait du pivot de gauss et comme en parametre elles sont constantes, je fais donc une copie dans A_ et b_ et je continue l'algo avec A_ et b_

blabla

return x ;// qui a ete defini plus haut dans l'algo bien entendu
}

dans mon main que je fais

int main()
{
Matrice A(3,3); b(3,1);

je rentre les coeff de la matrice A et b

cout<<A<<b<<endl;

x=gauss(A,b);
cout<<A<<b<<endl;

ici A et b ont été modifiées !!!

Pourquoi ??

En revanche, quand j'utilise dans la fonction gauss le constructeur par copie Matrice A_(A), b_(b); les matrices A et b ne sont pas modifiées.

Savez-vous pourquoi il est possible de modifier un objet constant ?

Merci.
Pom
A voir également:

8 réponses

salut Canard007
oui j'ai compris ta nuance entre l'objet, l'alias et sa copie. Mais je suis tout de meme étonné qu'avec const on puisse modifier la valeur des objets. Dans le suite d'un prgm, ca peut tout de meme gêner !

En tout cas, j'ai refais mon operator= de ma classe Matrice donc maintenant il n'y a plus de modification entre mon constructeur de copie et mon operateur =

Merci
Pom
0
Utilisateur anonyme
21 juin 2004 à 16:27
l'opérateur = appelle le constructeur par recopie
pas besoin de définir les 2 (seul le const par recopie suffit) si mes souvenirs sont bons (je doute fortement tout d'un coup :))
0
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177
21 juin 2004 à 16:51
salut, rectification, si tu définis le "=", tu dois definir le constructeur par copie, sinon le = ne servirait a rien, il ne fera que des copies de référence, c'est la régle des 3 (constructeur de copie, affectation et destructeur). Pour plus d'explication, voir ici :
http://docs.mandragor.org/files/Programming_languages/Cpp/Cours_de_c-cpp_par_Christian_Casteyde_%5Bfr%5D/x3176.html

tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
0
pom > tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009
21 juin 2004 à 18:10
Salut, merci pour l'adresse de la page web. Je pense que je vais imprimer son cours car il est clair et compréhensible (du moins la page que tu m'as transmise).

pom
0
grdTonioHardware Messages postés 43 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 22 avril 2007 12
21 juin 2004 à 16:34
ce que tu peux modifier c'est les valeurs que contiens l'objet.
mais ce qui est const dans le code c'est uniquement la référence
ou le pointeur si tu préfère donc tu n'a pas le droit de modifier le pointeur ( référence ) mais tu as tout à fait le droit de modifier les valeurs de l'objet pointé.

et puis évite de surcharger inutiliment l'opérateur = tu pourrais peut-être en avoir besoin plus tard, généralement quand on surcharge c'est pour rajoutter une définition pas en enlever.

Le mieux c que tu fasse un passage par copie ou renseigne toi sur les fonctions const ya un truc la-dessus aussi mais je m'en souviens plus et je veux pas dire de bétises.

@++ !!
0
salut, ce n'est pas une bonne nouvelle ce que tu me dis-là : comment puis-je faire que les données soient constantes ? car si maintenant les coefficients de ma matrice A varient, mon prgm risque de planter (ou de me renvoyer d'autres résultats).

Mais j'ai changé mon opérateur= et maintenant que je fasse A_(A) ou A_=A, je n'ai plus de changement. Je reste tout de meme très étonné.

Au moins, maintenant je sais que ce sont les adresses qui sont constantes...

Merci encore.

Pom
0
grdTonioHardware Messages postés 43 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 22 avril 2007 12
22 juin 2004 à 09:19
Ben en fait pour faire un passage par copie tt en mettant tes variables const tu dois faire comme ca :

Matrice gauss(const Matrice A, const Matrice b)
{...
...}

et la c'est tes objets qui sont constant donc tu ne peux pas modifier leurs valeurs.
mais je te conseil aussi de regarder les fonctions qui sont const dans un bon boukin de C++ par exemple pour vérifier ca s'écrit comme ca :

Const Matrice gauss(const Matrice A, const Matrice b)
{...
...}

et ca se déclare :

Matrice gauss(const Matrice A, const Matrice b) const;

je crois mais j'en suis pas sûr et normalement une fonction const n'a pas le droit de modifier les variables. Mais en tout cas tu est sûr que ca te retourne un objet const.

Voilà.

@++ !!!
0
salut grdTonioHardware, si j'ai bien compris le c++ :

le fait de faire Matrice gauss(const Matrice A, const Matrice b) fait que A et b sont passées par copie (donc ce n'est pas super si A et b sont des matrices très grosses).

Je pense (mais je n'en suis pas très sur) qu'écrire Const Matrice gauss(const Matrice A, const Matrice b) fait que la matrice renvoyée par gauss est constante (de toute manière A et b sont des copies de mon "vrai" A et b du programme car il n'y a pas de passage par référence

Tu me donnes sinon une très bonne idée. Je croyais qu'écrire Matrice gauss(const Matrice A, const Matrice b) const; n'était réservé que pour les fonctions membres pour lesquelles on ne modifiait pas les données de la classes à laquelle appartient la fonction.

Avec tout ca, j'espère être calé en objet constant !

merci encore
pom
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
marvinrouge
22 juin 2004 à 09:52
Salut à tous

Le 'PROTECTION' offerte par le const peut être détournée de plein de manière en C++.

Un autre exmeple:

cont A a = ...

char* s = (char*)&a;

s[0] = '1';

L'objet 'a ' a été modifié (bon je vous l'accorde on a mis n'importe quoi puisque sur SA zone mémoire on a mis un '1' arbitraire ...
0
Salut marvinrouge, ce n'est pas une bonne nouvelle ton message. Je commence à douter des objets const...


Sinon, dans une de tes réponses (à je ne sais plus qui) tu avais dit que les float étaient buggés. Qu'entend-tu par buggés ? Pourrais-tu me donner un exemple ?
Merci

Pom
0
marvinrouge > pom
22 juin 2004 à 10:41
Resalut Pom,

pour les const si on fait pas de cast tordus ou si on ne rompt pas l'encapsulation "en général" y'a pas de prb. mais tou le monde code pas proprement ...

pour les float leur taille est pas standard selon les OS de mémoire
ET
0.9 + 0.1 fait pas toujours 1.0 ...

(les double ont aussi ce genre de prb mais moins souvent)
0
pom > marvinrouge
22 juin 2004 à 10:53
re,
ok merci, c'est bon à savoir.
pom
0
grdTonioHardware Messages postés 43 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 22 avril 2007 12
22 juin 2004 à 10:24
Très juste mais au pire ta fonction tu sais qu'elle est dangereuse et tu la met en private.
:-)

@++ !!
0
rubenlebigboss
30 déc. 2009 à 01:38
pfffffffffffffffffffffffffffffffffffffffffff banke de trafiqueur
0
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
21 juin 2004 à 15:00
tu as la reponse a ta question dans ta question ;-)...
dans ta fonction tu fait un passage par reference donc un pointeur verx l objet qui sera constant...par contre le contenu peut tout a fait evoluer...par contre par copie il est clair que cela ne marchera pas puisque c est la copie que tu modifie..je c pas si j ai etait assez klr?
Enfin pour mieux comprendre regarde ce qui ce passe dans la fonction gauss avec le debugger dans les 2 cas tu verra :
regarde l@ des matrices dans les 2 cas tu verra qu elle ne coincide pas ...
-1