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)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top