Differenza tra C ++ riferimenti const e const?
Domanda
Qual è la differenza tra:
const double& pi = 3.14;
e (non commerciale):
const double pi = 3.14;
Entrambi sembrano avere la stessa L e R valori così qual è la differenza?
Soluzione
Per il vostro esempio particolare non c'è differenza.
E questo significa che, non c'è modo di dire loro a parte, qualunque.
Tuttavia, poiché i primi lega un riferimento ad un temporaneo, quando il tipo è di tipo classe temporanea può essere di una classe derivata, per esempio prodotto da una funzione! E ha poi suo distruttore propriamente detta alla fine del campo di applicazione. Questo piccolo el neato trucco è usato nelle implementazioni ScopeGuard (vedi la Articolo originale ScopeGuard in DDJ , da Petru Marginean e Andrei Alexandrescu - Petru inventato ScopeGuard e Andrei fatto una cosa più generale sulla parte superiore)
.Una volta ho chiesto a Bjarne Stroustrup, che ha creato il linguaggio C ++, il motivo per cui è supportata la sintassi nella prima dichiarazione.
E la sua risposta è stata che era per lo più di avere regole uniformi (vale a dire di non fare alcuna eccezione speciale per i riferimenti locali in contrasto con riferimenti come parametri formali). Credo che in quel momento nessuno di noi erano familiarità con ScopeGuard. E 'semplice in retrospettiva, ma ci vuole una mente come Petru di, o Andrei di, a venire con qualcosa di simile! : -)
Saluti e hth.
Altri suggerimenti
La differenza importante con un riferimento è un riferimento sé è inheritly costante. Una volta che il riferimento stesso è stato inizialmente assegnato ad una variabile, non può quindi fare riferimento a un'altra variabile. Tutti i tentativi di modificare modificherà la variabile si riferisce. Detto questo, il const
significherà che il riferimento è un riferimento a un const int
.
const int A;
const int B;
const int& Reference = A;
Reference = B; // Error, the value of A can not be assigned, nor would this *ever* be able to make Reference refer to B.
Si può anche verificare questa teoria circa un riferimento stesso di essere costanti in questo modo:
const int& const Reference; // Should give a warning about the second const being redundant.
Un po 'di chiarezza sui riferimenti costanti, riferimenti e costanti per double
s.
Riferimento
Un riferimento si riferisce a un un oggetto esistente e non può essere reseated. Cioè, una volta che si dichiara (definire) il riferimento, sarà sempre riferimento a tale elemento.
riferimento costante
Il linguaggio C ++ consente per dichiarare un riferimento costante. Questo dice al compilatore che il riferimento non cambierà. Questo può essere ridondante in quanto i riferimenti non possono essere sia collegato. Tuttavia, la sintassi del linguaggio lo permette.
Costante
Una costante è un valore, e non si fare riferimento per nulla.
Ottimizzazioni & Sostituzioni
Il compilatore è consentito sostituto (sostituire) un riferimento a un oggetto, costante o letterale con l'oggetto corrispondente, costante o letterale, a condizione che il compilatore può garantire che nessun operazioni di scrittura vengono eseguite per quell'oggetto nel campo è utilizzato. Questa determinazione può diventare difficile quando si passa il riferimento a metodi o funzioni all'interno di tale campo di applicazione.
Come specificare il modificatore const
ad un riferimento renderà il lavoro del compilatore più facile per l'ottimizzazione. Il riferimento costante è un contratto con il programmatore e l'utente che il riferimento non sarà modificato.
const double & è un riferimento a una costante doppia, l'altra è una doppia costante. Un riferimento è una specie di un puntatore const, un puntatore che non cambia mai.
In C ++ i riferimenti sono intrinsecamente const. Una volta che sono stati assegnati si può non li cambia. Essi devono essere sia dichiarato e inizializzato.
L'isnt const solo come riferimento il valore è const, così si dovrebbe essere in grado referense Riassegna, che significa quanto segue sarebbero ok:
const double& pi = 3.14;
const double pi2 = 2.78;
pi = *(&pi2);