#include<iostream>
using namespace std;
class temp
{
int value1;
public :
void fun() const
{
((temp*)this)->value1 = 10;
}
void print()
{
cout<<value1<<endl;
}
};
int main()
{
temp t;
t.fun();
t.print();
}
Répondre
Parce que vous êtes loin const
... casting
Quand vous lancez quelque chose, la responsabilité est à vous pour faire en sorte que cela ne fait pas quelque chose de stupide.
Notez que si temp t;
est changé en const temp t;
, vous obtenez un comportement non défini, pour modifier une valeur const
.
Par coïncidence, j'ai littéralement abordé cela dans my blog. (Presque la même fonction, aussi.)
+1 pour la perspective 'const temp t'. – Chubsdad
Hey haha je ne savais pas que vous avez un blog. nice :) –
C++ essaie de prévenir les erreurs accidentelles, mais il ne se démène pas pour combattre un programmeur déterminé à faire les choses à sa façon. Si vous utilisez des opérateurs de casting, vous le dites "croyez-moi, je sais ce qu'il y a", exigeant qu'il ignore sa propre connaissance du programme. C'est justement parce que l'opérateur de casting de type C que vous avez utilisé est dangereux et peut facilement être mal utilisé que C++ introduit static_cast, const_cast et reinterpret_cast, qui communiquent l'intention du programmeur de façon à ce que le compilateur puisse toujours dire , cela exigerait plus que le type de clémence que vous demandez ". reinterpret_cast est le grand papa bien que ... pas de discussion avec ça ... aussi brutale que la distribution en C et rarement nécessaire dans une application de haut niveau. Précisément parce qu'il est rarement nécessaire, verbeux et facilement visible, il attire l'attention. Le code jonché de moules de style C peut facilement cacher les bogues.
'reinterpret_cast' ne fonctionnerait pas ici: il ne peut pas rejeter constness. – UncleBens
5,4/5 $ est d'environ explicit type conversion
(qui est ce qui est utilisé ici)
Les conversions effectuées par
- un const_cast (5.2.11),
- un static_cast (5.2.9),
- un static_cast suivi d'un const_cast,
- re interpret_cast (02/05/10), ou
- un reinterpret_cast suivi d'un const_cast,
peuvent être effectuées en utilisant la notation de fonte de conversion de type explicite. Les mêmes restrictions sémantiques et les comportements s'appliquent. Si une conversion peut être interprétée dans plus d'une des façons énumérées ci-dessus, l'interprétation qui apparaît en premier dans la liste est utilisée, même si est mal formé un casting résultant de cette interprétation. Si une conversion peut être interprétée en de plus d'un chemin en tant que static_cast suivi d'un const_cast, la conversion est mal formée.
Dans ce cas, ((temp*)this)
a été traité comme (const_cast<temp *>(this))
et a été bien formé. Ceci a enlevé la constance, permettant ainsi de changer la valeur de membre de classe.
- 1. const return valeur de la fonction
- 2. Quelle est la différence entre une fonction membre const et une fonction membre non-const?
- 3. C const/versions non-const de même fonction
- 4. NSDatePicker - obtention de la valeur quand elle est changée
- 5. Affectation de membres dans une fonction const
- 6. Passer la même valeur dans une fonction récursive? Je
- 7. Emplacement de const dans une fonction
- 8. Test si la valeur est une fonction
- 9. attribution d'une valeur const à une erreur const en php
- 10. pointeur vers une fonction membre const typedef
- 11. Pourquoi const pour conversion implicite?
- 12. Comment vérifier si une valeur de const char * est définie?
- 13. valeur Initilizing pour une donnée const
- 14. lien Doxygen à la fonction const
- 15. valeur initialisation d'un membre const
- 16. Pourquoi ne puis-je pas attribuer une valeur const et que faire à la place?
- 17. Modification de la valeur d'un pointeur const
- 18. Comment ajouter un entier à une valeur de const const dans iphone?
- 19. Comment créer un élégant for_each() en C++ dans une fonction membre où la fonction d'exploitation est une autre fonction membre de la même classe?
- 20. spécification de la fonction Const en UML
- 21. La valeur de colonne de clic de ligne doit être changée dans jqgrid
- 22. Renvoi d'un C++ référence dans une fonction membre const
- 23. Pourquoi une variable const est-elle disponible dans une méthode statique?
- 24. Pourquoi MySQL ENCRYPT() donne-t-il la même valeur?
- 25. Quelle est la différence entre passer une fonction et l'appel de fonction lui-même en javascript?
- 26. pourquoi avons-nous besoin à la fois const et getters non-const dans cet exemple
- 27. Je reçois une erreur indéfinie dans firebug, même si je peux voir la valeur existe! ... pourquoi?
- 28. quelle est la même fonction de FOUND_ROWS() dans firebird?
- 29. Distinguer entre const et méthode non-const avec le même nom dans boost :: bind
- 30. g ++ linker ne peut pas trouver la fonction const membre
Par ailleurs, une meilleure façon de procéder est de rendre mutable la valeur1 –
@jk: Le gros inconvénient de 'mutable' est qu'elle rend la variable mutable pour toutes les méthodes, et pas seulement une. La distribution est beaucoup moins invasive et donc le moindre mal à mon humble avis. –
Conseil: N'utilisez que des transtypages de style C++ ("* _cast") pour rendre votre intention visible. N'utilisez pas les moulages de type C "(type)", car il s'agit de tous les moulages possibles. –