C ++ funzioni che assumono valori, dove dovrebbero essere prendendo riferimenti
-
22-09-2019 - |
Domanda
Sto imparando C ++, e provenienti da c, alcune chiamate di funzione che sto vedendo nel libro mi confondono:
char a;
cin.get(a);
In C, questo non poteva funzionare, se hai fatto, non ci sarebbe alcun modo per ottenere il risultato, perché si sta passando per valore, e non con riferimento, perché fa questo lavoro in C ++? Fa riferimento e dereferncing reso implicito (il compilatore sa che cin.get ha bisogno di un puntatore, quindi si fa riferimento)?
Soluzione
C ++
Questo potrebbe funzionare in C ++ perché la firma di funzione per get()
è probabilmente questo:
void get(char& a); // pass-by-reference
Il simbolo &
dopo char
denota al compilatore rispetto a quando si passa a un valore char
, dovrebbe passare un riferimento al char
piuttosto che fare una copia di esso.
Ciò significa in sostanza è che tutte le modifiche effettuate entro get()
saranno riflessi nel valore della a
fuori del metodo.
Se la firma di funzione per get()
era questa:
void get(char a); // pass-by-value
quindi a
sarebbe passata da valore , che indica una copia di a
viene effettuata prima di essere passato al metodo come parametro. Eventuali modifiche a a
sarebbero quindi solo locali il metodo, e ha perso quando il metodo restituisce.
C
Il motivo per cui questo non avrebbe funzionato in C è causa C ha solo pass-by-value . L'unico modo per emulare passaggio per riferimento comportamento in C è passare il suo puntatore per valore, e quindi de-riferimento il valore del puntatore (accedendo quindi la stessa posizione di memoria) quando si modifica il valore all'interno metodo:
void get(char* a)
{
*a = 'g';
}
int main(int argc, char* argv[])
{
char a = 'f';
get(&a);
printf("%c\n", a);
return 0;
}
L'esecuzione di questo programma sarà in uscita:
g
Altri suggerimenti
I tipi di riferimento funziona come quello (passaggio per riferimento, invece di passare per valore). È analogo al passaggio di un puntatore (passaggio per puntatore) in C, ma con una sintassi migliore e più sicurezza (tempo di compilazione controlli). L'attuazione passa puntatore internamente.
C ++ consente passaggio per riferimento (nota la &
, che significa che è utilizzato un riferimento):
void foo(char& bar) {
bar = 42;
}
int main() {
char a;
foo(a);
// a == 42 here
}
Questo è il motivo per cui alcuni programmatori C ++ non amano utilizzare i riferimenti del genere.
Sembra una funzione arguement -. Non avete idea della sintassi se 'a' viene modificato o no
Preferisco passare riferimenti const (quando si dispone di un oggetto di grandi dimensioni e una copia sarebbe costoso) e il ritorno riferimenti o meglio di tutti i puntatori di passaggio.