#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();
}
risposta
Perché si sta gettando via const
...
Quando lanci una cosa, la responsabilità è tua per fare in modo che non fa qualcosa di stupido.
Nota che se temp t;
viene modificato in const temp t;
, si ottiene un comportamento indefinito, per la modifica di un valore const
.
Per coincidenza ho letteralmente toccato questo in my blog. (Quasi la stessa funzione anche.)
+1 per la prospettiva 'const temp t'. – Chubsdad
Hey haha non sapevo che tu abbia un blog. nice :) –
Il C++ cerca di prevenire errori accidentali, ma non si sforza di combattere un programmatore che è determinato a fare le cose a modo suo. Se usi gli operatori del cast gli stai dicendo "fidati di me, so cosa c'è", chiedendo di ignorare la propria conoscenza del programma. È proprio perché l'operatore di casting in stile C che hai usato è pericoloso e può essere facilmente utilizzato in modo improprio che C++ introduce static_cast, const_cast e reinterpret_cast, che comunicano l'intento del programmatore in modo tale che il compilatore possa ancora dire "hey, tieni lì , che richiederebbe più del solo tipo di clemenza che stai chiedendo ". reinterpret_cast è il grande papà però ... non discutere con quello ... altrettanto brutale quanto il cast di C e raramente necessario in un'applicazione di alto livello. Proprio perché raramente è necessario, prolisso e facilmente visibile, richiama l'attenzione. Il codice disseminato di cast in stile C può nascondere facilmente i bug.
'reinterpret_cast' non funzionerebbe qui: non può gettare via la costanza. – UncleBens
$ 5,4/5 è di circa explicit type conversion
(che è quello che viene utilizzato qui)
Le conversioni eseguite da
- un const_cast (5.2.11),
- uno static_cast (5.2.9),
- uno static_cast seguito da un const_cast,
- una ri interpret_cast (5.2.10), o
- un reinterpret_cast seguito da un const_cast,
possono essere eseguite utilizzando la notazione cast di conversione esplicita. Si applicano le stesse restrizioni e comportamenti semantici semantica. Se una conversione può essere interpretato in più di uno dei modi di cui sopra, l'interpretazione che appare per primo nella lista è utilizzato, anche se un cast risultante da che l'interpretazione è mal formati. Se una conversione può essere interpretata in più di un modo come un static_cast seguito da un const_cast, la conversione non è corretta.
In questo caso, ((temp*)this)
è stato trattato come (const_cast<temp *>(this))
ed era ben formato. Questo rimosse la costanza, permettendo così di cambiare il valore del membro della classe.
- 1. Il valore di discesa JQuery rileva è selezionato anche se non viene modificato
- 2. modifica del campo di immissione jQuery anche quando il valore viene modificato tramite jquery
- 3. L'ambito JavaScript viene modificato? Perché succede?
- 4. Perché il valore in dict è stato modificato in python?
- 5. Perché passare per riferimento const anziché per valore?
- 6. Uso strano di const: perché viene compilato?
- 7. UITextField Valore evento modificato?
- 8. Perché operator ++ restituisce un valore non const?
- 9. Assegnazione membro in una funzione const
- 10. Se il contenuto in CKEditor viene modificato
- 11. Come viene implementato "const"?
- 12. In javascript, come attivare l'evento quando viene modificato il valore di una variabile?
- 13. Richiamare il metodo personalizzato sul valore modificato
- 14. Perché questa dichiarazione const const const valido
- 15. Perché un array C ha un valore sizeof() errato quando viene passato a una funzione?
- 16. In che modo const dopo una funzione ottimizza il programma?
- 17. `const T * restrict` garantisce che l'oggetto puntato non venga modificato?
- 18. Come mai un const temporaneo sceglie di chiamare una funzione membro non const su un const?
- 19. cambiando il valore const in C
- 20. Chiamare una funzione membro non const da una funzione membro const
- 21. evento onchange non si attiva quando il valore viene modificato in onkeyup evento
- 22. Endless looping quando il valore src viene modificato in Internet Explorer
- 23. Casella di testo ASP.NET che perde valore dopo il postback quando il valore viene modificato lato client tramite javascript
- 24. Qual è la differenza tra una funzione membro const e una funzione membro non const?
- 25. funzione template overloading: const * contro const &
- 26. Il valore della proprietà C# non viene modificato in Javascript/jquery
- 27. Funzione puntatore alla funzione __attribute __ ((const))?
- 28. Android - Esegui qualcosa * dopo * il testo viene modificato in EditText
- 29. C++ virtuale Const Funzione
- 30. merito funzione membro const
incidentalmente un modo migliore per farlo è quello di rendere il valore1 mutabile –
@jk: Il grande svantaggio di 'mutable' è che rende la variabile mutabile per * tutti * i metodi, non solo uno. Il cast è molto meno invasivo e quindi il male minore IMHO. –
Consiglio: usa solo cast di stile C++ ("* _cast") per rendere visibile il tuo intento. Non utilizzare i cast di tipo C "(tipo)", perché questi sono tutti i cast possibili in uno. –