2016-06-08 33 views
7

const value viene spesso utilizzato nella programmazione. Fornisce al programmatore la sicurezza che il valore non cambierà in futuro. Sfortunatamente, questo non è pienamente applicato. Di conseguenza, a volte causa errori sottili che sono molto difficili da decifrare. Come esempio:Modi per modificare il valore const in C++

int a = 1; 
const int& b = a; // I promise I will not change 
a = 3; // I am a liar, I am now 3 
cout << b; // As I will now show 3 

È possibile cambiare const valori anche in altri modi; alcuni di questi sono piuttosto complessi e richiedono una buona quantità di codice che spesso si perde in un altro segmento di codice e quindi causa bug.

Così qualcuno dovrebbe elaborare i possibili modi per modificare un const value? Non preoccuparti se non sai tutto, molti non lo farebbero (incluso me stesso). Dì solo tutti i modi in cui sai - dopotutto puoi solo dare quello che hai!

+8

'a = 3' non è una bugia poiché' a' è non-const. 'const_cast (b) = 3;' sarebbe una bugia. –

+8

'b' non ha promesso che il valore non cambierà. Ciò che viene applicato è che non è possibile modificare il valore usando direttamente il riferimento 'const'. Penso che sia una domanda interessante, ma il tuo esempio non è sicuramente il migliore – user463035818

+2

ma non è questo bogus di esempio dato che stai facendo 'b' const not' a' se hai fatto 'b = 3' allora non sarebbe riuscito a compilare – EdChum

risposta

9
const int& b = a; // I only promise I will not change the value via b, nothing more. 

const non garantisce il valore non verrà modificato da altri riferimenti o puntatori. Pensate il seguente codice:

void f(const int& b) { ... } 
... 
int a = ...; 
f(a); 
a = ...; 

Il valore di a non verrà modificato all'interno f() (dal argomento passato), questo è tutto la garanzia.

const è solo un aiuto. Se non cambierai sth, allora crealo const, quindi il compilatore ti aiuterà a controllarlo. È ancora possibile modificare il valore originale in altri modi, come mostrato dal codice, è comunque responsabilità dell'utente, infine.

1

è necessario prima utilizzare un constvariable come pointer quindi utilizzare di const_cast<data-type>() dichiarazione, come muggito:

utilizzando namespace std;

int main() 
{ 

    const int *i = new int(0); 
    int *n = const_cast<int*>(i); 

    *n = 10; 
    cout << *n << endl << *i << endl; 
    return 0; 
} 

uscita sarà:

10 
10 
1

È impossibile modificare valori const senza causare un comportamento indefinito.

Il compilatore non tenta di calcolare la differenza tra valori const e non const. Si affida a te, il programmatore, per informarlo attraverso il sistema dei tipi. I nomi sono const o non-const e il compilatore applica constness sul nome , non sul valore.

Ci sono momenti in cui sembra possibile modificare un valore const, ad esempio quando quel valore ha un riferimento ad un altro valore e lo modifica. La prima intuizione dice che questi casi non dovrebbero comportarsi in questo modo, ma una volta che capisci e consideri la correttezza delle costanti, trovi che è abbastanza coerente.

2

Sì, const_cast può essere utilizzato per rimuovere l'effetto della parola chiave 'const' (ma non sempre).Ad esempio:

int a= 1; 
    const int& b = a; 
    a = 3; 
    std::cout<<b<<std::endl; 
    const_cast<int&>(b) = 4; 
    std::cout<<b<<std::endl; 

Riferimento: http://en.cppreference.com/w/cpp/language/const_cast

2
int a=1; 
    const int *b=&a; 
    a=3; 
    cout<<(*b); 
    return 0; 
1
int k = 0; 
const int *l = &k; 
cout<<*l; // 0 
k=1; 
cout<<*l; // 1 

Qui dichiarano solo una variabile come constant cioè l. Quindi la variabile l non può più essere modificata. E assegno l all'indirizzo k;

Ma ora posso modificare il valore di k ovunque, e questo si rifletterà in l perché condividono la stessa memoria.