2012-01-13 76 views
26

Eventuali duplicati:
What are the differences between pointer variable and reference variable in C++?come funziona la e commerciale (&) segno in C++?

Questo mi confonde:

class CDummy 
{ 
public: 
    int isitme (CDummy& param); 
}; 

int CDummy::isitme (CDummy& param) 
{ 
    if (&param == this) 
    { 
     return true; //ampersand sign on left side?? 
    } 
    else 
    {  
     return false; 
    } 
} 

int main() 
{ 
    CDummy a; 
    CDummy* b = &a; 

    if (b->isitme(a)) 
    { 
    cout << "yes, &a is b"; 
    } 

    return 0; 
} 

In C & di solito significa l'indirizzo di un var. Cosa significa qui? Si tratta di un modo elegante di notazione puntatore? Il motivo per cui sto assumendo che sia una notazione di puntatore perché questo è un puntatore dopotutto e stiamo controllando l'uguaglianza di due puntatori. Grazie.

+10

Senza alcuna mancanza di rispetto, questo sarà trattato nei primi capitoli di qualsiasi libro introduttivo in C++. Posso suggerire di consultarne uno? –

+0

bene sto studiando da cplusplus.com e hanno questo esempio. – infinitloop

+4

"* sto studiando da cplusplus.com *" Questo è il tuo primo errore. Il sito non è un buon riferimento e ** specialmente non ** una buona risorsa di apprendimento. – ildjarn

risposta

33

Per iniziare, si noti che

this 

è un puntatore speciale (== indirizzo di memoria) alla classe la sua in. primo luogo, un oggetto è un'istanza:

CDummy a; 

successivo, un puntatore viene istanziata:

CDummy *b; 

Avanti, l'indirizzo di memoria a è assegnato al puntatore b:

b = &a; 

Successivamente, il metodo CDummy::isitme(CDummy &param) viene chiamato:

b->isitme(a); 

Un test viene valutata all'interno di questo metodo:

if (&param == this) // do something 

Ecco la parte difficile. param è un oggetto di tipo CDummy, ma &param è l'indirizzo di memoria di param. Quindi l'indirizzo di memoria di param è testato su un altro indirizzo di memoria chiamato "this". Se si copia l'indirizzo di memoria dell'oggetto da cui viene chiamato questo metodo nell'argomento di questo metodo, ciò comporterà true.

Questo tipo di valutazione di solito è fatto quando sovraccaricare il costruttore di copia

MyClass& MyClass::operator=(const MyClass &other) { 
    // if a programmer tries to copy the same object into itself, protect 
    // from this behavior via this route 
    if (&other == this) return *this; 
    else { 
     // otherwise truly copy other into this 
    } 
} 

Si noti inoltre l'utilizzo di *this, dove this è essere dereferenziati. Cioè, invece di restituire l'indirizzo di memoria, restituire l'oggetto situato in quell'indirizzo di memoria.

+1

Davvero una bella rottura, grazie. – tetris11

37

Il & ha più l'uno significati:

1) prendere l'indirizzo di una variabile

int x; 
void* p = &x; 
//p will now point to x, as &x is the address of x 

2) passare un argomento facendo riferimento a una funzione

void foo(CDummy& x); 
//you pass x by reference 
//if you modify x inside the function, the change will be applied to the original variable 
//a copy is not created for x, the original one is used 
//this is preffered for passing large objects 
//to prevent changes, pass by const reference: 
void fooconst(const CDummy& x); 

3) dichiarare una variabile di riferimento

int k = 0; 
int& r = k; 
//r is a reference to k 
r = 3; 
assert(k == 3); 

4) bit a bit ed esercente

int a = 3 & 1; // a = 1 

n) altri ???

+4

E bit-wise * e * –

+1

La domanda è specifica. Cosa significa nel codice nella Q? –

+1

Non ho nulla contro i downvotes, ma mi piacerebbe sapere perché, per poter imparare qualcosa. –

1

Bene il CDummy& param che è dichiarato come un parametro della funzione CDummy::isitme è in realtà un reference che è "come" un puntatore, ma diverso. La cosa importante da notare sui riferimenti è che all'interno delle funzioni in cui vengono passati come parametri, si ha realmente un riferimento all'istanza del tipo, non "solo" un puntatore ad esso. Quindi, in linea con il commento, '&' funziona come in C, sta ricevendo l'indirizzo dell'argomento passato e confrontandolo con this che è, ovviamente, un puntatore all'istanza della classe il metodo è stato chiamato.

Problemi correlati