2012-02-03 3 views
5

supponiamo di avere una funzione che accetta const passaggio argomento di riferimento,C++ funzione: passare argomento non const al parametro di riferimento const

int func(const int &i) 
{ 
    /* */ 
} 

int main() 
{ 
    int j = 1; 
    func(j); // pass non const argument to const reference 
    j=2; // reassign j 
} 

questo codice funziona fine.according a C Primer ++, ciò che questo argomento passando a questa funzione è come segue,

int j=1; 
const int &i = j; 

in cui i è sinonimo (alias) di j,

la mia domanda è: se i è sinonimo di j, e mi è definito come const, i s il codice:

const int & i = j

redelcare una variabile non const a const variabile? perché questa espressione è legale in C++?

risposta

12

Il riferimento è const, non l'oggetto. Non cambia il fatto che l'oggetto sia mutevole, ma tu hai un nome per l'oggetto (j) attraverso il quale puoi modificarlo, e un altro nome (i) attraverso il quale non puoi.

Nel caso del parametro di riferimento const, ciò significa che main può modificare l'oggetto (in quanto utilizza il nome per esso, j), mentre func non può modificare l'oggetto fintanto che usa solo il nome it, i. funcpotrebbe in linea di principio modificare l'oggetto creando ancora un altro riferimento o puntatore ad esso con un const_cast, ma non farlo.

+0

significa che il riferimento non è l'oggetto stesso. allora come capire la i è sinonimo di j? vuol dire che io e j siamo lo stesso oggetto, perché entrambi i e j hanno lo stesso indirizzo fisico? – fuyi

+0

i è un riferimento alternativo all'oggetto j. Quindi un sinonimo. Hai comunque affermato che non puoi usare "i" per modificare l'oggetto a cui si riferisce. Nulla dice che non puoi usare qualche altro metodo per modificare l'oggetto a cui mi riferisco. Stai limitando le capacità di i con quella dichiarazione, non provando ad estenderli, e va bene. –

+1

@xiaopang: "i" e "j" sono nomi. Entrambi si riferiscono allo stesso oggetto. Spesso diciamo che qualcosa "è" il suo nome, o che il nome "è" l'oggetto. Ad esempio potrei dire "I am Steve". Ma questa è una terminologia imprecisa, i due non sono la stessa cosa. Posso anche dire "Steve" inizia con la "S" maiuscola. Ciò non implica che * I * inizi con una "S" maiuscola. Le virgolette su "Steve" sono lì per indicare che sto parlando del nome, non dell'oggetto a cui si riferisce. 'i' e' j' sono sinonimi perché sono entrambi i nomi per lo stesso oggetto, ma le loro proprietà come nomi sono differenti. –

3
const int &i = j; 

Questo dichiara un riferimento a un numero intero costante. Utilizzando questo riferimento, non sarà possibile modificare il valore del numero intero a cui fa riferimento.

È ancora possibile modificare il valore utilizzando il nome della variabile originale j, semplicemente non utilizzando il riferimento costante i.

Problemi correlati