A voir également:
- J'ai réussi à modifier des objets const !!
- Site pour vendre des objets d'occasion - Guide
- Modifier dns - Guide
- Modifier liste déroulante excel - Guide
- Comment modifier un pdf - Guide
- Modifier story facebook - Guide
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
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
Utilisateur anonyme
21 juin 2004 à 16:27
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 :))
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 :))
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
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!!!
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!!!
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
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
pom
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
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.
@++ !!
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.
@++ !!
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
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
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
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à.
@++ !!!
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à.
@++ !!!
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ...
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 ...
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)
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)
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
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.
:-)
@++ !!
:-)
@++ !!
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
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 ...
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 ...