Domanda

non dereferenziazione un puntatore e passaggio che per una funzione che prende il suo argomento con riferimento creare una copia dell'oggetto?

È stato utile?

Soluzione

In questo caso viene copiato il valore del puntatore (se questo non è necessariamente il caso come l'ottimizzatore può ottimizzare fuori).

int val = *pPtr;

In questo caso però nessuna copia avrà luogo:

int& rVal = *pPtr;

Il motivo nessuna copia avviene perché un riferimento non è un costrutto livello codice macchina. Si tratta di un costrutto di livello più alto e quindi è qualcosa usi compilatore internamente piuttosto che generare codice specifico per esso.

Lo stesso, ovviamente, va ai parametri di funzione.

Altri suggerimenti

Nel caso semplice, no. Ci sono casi più complicati, però:

void foo(float const& arg);
int * p = new int(7);
foo(*p);

Qui, viene creato un oggetto temporaneo, poiché il tipo del puntatore Dereferenced (int) non corrisponde al tipo di base del parametro funzione (float). Esiste una sequenza di conversione, e il temporaneo convertito può essere associato a arg dato che è un riferimento const.

Speriamo che non fa:. Sarebbe se la funzione chiamata prende il suo argomento per valore

Inoltre, questo è il comportamento previsto di un riferimento:

void inc(int &i) { ++i; }

int main()
{
    int i = 0;
    int *j = &i;
    inc(*j);
    std::cout << i << std::endl;
}

Questo codice si prevede di stampare 1 perché inc prende il suo argomento per riferimento. Aveva una copia stata fatta su convocazione inc, il codice sarebbe stampare 0.

No. Un riferimento è più o meno come un puntatore con notazione differente e la limitazione che non v'è alcun riferimento nullo. Ma come un puntatore che contiene solo l'indirizzo di un oggetto.

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