2010-08-26 6 views
5
#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(); 
} 
+1

Par ailleurs, une meilleure façon de procéder est de rendre mutable la valeur1 –

+1

@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. –

+1

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. –

Répondre

14

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.)

+2

+1 pour la perspective 'const temp t'. – Chubsdad

+0

Hey haha ​​je ne savais pas que vous avez un blog. nice :) –

3

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.

+0

'reinterpret_cast' ne fonctionnerait pas ici: il ne peut pas rejeter constness. – UncleBens

5

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.

Questions connexes