Serve aiuto per capire l'operatore di riferimento (C ++) in funzioni specifiche

2

Nel semestre in corso presso l'università stiamo lavorando su OOP con C ++.
Vorrei capire la differenza tra un puntatore e un operatore di riferimento.

Le differenze che capisco sono:
1. Impossibile modificare l'oggetto a cui la variabile di riferimento è associata a
2. possiamo usare le variabili di riferimento per riferirci all'oggetto binded senza dover digitare il & operatore (in contrasto con i puntatori in cui dovremmo scrivere * pi = 5;)

Inoltre, una variabile di riferimento contiene l'indirizzo dell'oggetto a cui è stato associato?
Nell'esempio:

int i;
int &ri = i; 

Qui ri contiene l'indirizzo di i?

E il motivo per cui quando si esegue il overloading dell'operatore ++ in questo esempio di enumerazione stiamo usando gli operatori dereference o reference (*) prima del nome della funzione.

    
posta Chris 24.12.2011 - 12:38
fonte

4 risposte

6

Un riferimento ha uno scopo: agire come alias per una variabile esistente:

int i;
int &ri = i;

In questo esempio, gli indirizzi di i e ri sono identici ( &i == &ri ). I due nomi si riferiscono alla stessa posizione in memoria. Quindi una delle applicazioni utili dei riferimenti è fornire un alias per un nome lungo che sarebbe uno spreco da ridigitare:

const Location& p = irresponsibly_long_object_name.retrieve_location();

Quando si passa un parametro di funzione per riferimento, ha lo stesso effetto:

void increment(int& parameter) { ++parameter; }

int main(int argc, char** argv) {
    int variable = 0;
    increment(variable);
}

Qui parameter funge semplicemente da alias di variable , proprio come se fosse definito come int& parameter = variable . La modifica di parameter all'interno di increment() è indistinguibile dalla modifica di variable in main() . Inoltre, e questo è abbastanza utile, variable non ha bisogno di essere copiato; quindi se fosse di un tipo grande come std::list<int> , passarlo per riferimento sarebbe molto più efficiente. Questo è il punto principale di const riferimenti.

Ai fini dei parametri di funzione del tipo di riferimento, la linea di azione più corretta per un compilatore è di usare un puntatore internamente, come se avessi scritto:

void increment(int* parameter) { ++*parameter; }

int main(int argc, char** argv) {
    int variable = 0;
    increment(&variable);
}

Questo è un dettaglio interessante e vale la pena di ricordare. Anche se non è essenziale per la comprensione dei riferimenti, riconoscere questa equivalenza consente di pensare ai puntatori semplicemente come riferimenti espliciti . Allo stesso modo, i riferimenti sono puntatori impliciti.

    
risposta data 25.12.2011 - 04:32
fonte
2

Tecnicamente, non ci sono molte differenze tra la variabile di tipo int* e int& (eccetto quei dettagli sintattici sul dereferenziamento e l'accesso ai membri). La principale differenza nell'uso pratico IMHO è che non è possibile modificare l'oggetto a cui fa riferimento un riferimento dopo l'inizializzazione (mentre è possibile modificare l'indirizzo a cui punta il puntatore) e un riferimento non può essere NULL (almeno, non senza un brutto cast di C ++ hack).

Ecco una spiegazione completa dell'argomento:

link

    
risposta data 24.12.2011 - 15:34
fonte
1

Tecnicamente parlando, i riferimenti non sono oggetti e non è possibile ragionare sul loro contenuto. Tuttavia, in realtà, come puntatori sotto il cofano è come vengono spesso implementati.

Per quanto riguarda la dichiarazione / definizione della funzione, sono non operatori . Sono sintassi. int& è un tipo . Significa "restituisco un riferimento". Restituire un int& non è diverso dal restituire un int - restituisci una cosa di quel tipo.

Ovviamente, è duplice uso dato che la sintassi e un operatore non è utile, ma qui non è in corso alcuna operazione.

    
risposta data 24.12.2011 - 12:47
fonte
1

Un riferimento è un altro nome (alias) per un oggetto esistente; ti dà il potere di "passare per riferimento" e la comodità di usarlo come se fosse l'oggetto stesso.

Nel tuo esempio, l'indirizzo di ri e i sono gli stessi ei valori di ciascuno sono gli stessi. Il modo in cui il compilatore gestisce questo è un altro argomento, ma in realtà si riduce alla mia prima frase.

    
risposta data 24.12.2011 - 18:00
fonte

Leggi altre domande sui tag