2012-01-13 17 views
26

Powiel możliwe:
What are the differences between pointer variable and reference variable in C++?Jak działa znak ampersand (&) w języku C++?

To jest mylące mnie:

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; 
} 

W C & zwykle oznacza adresu var. Co to znaczy tutaj? Czy jest to fantazyjny sposób zapisu notacji? Powodem, dla którego zakładam, że jest to notacja wskaźnikowa, ponieważ jest to wskaźnik po wszystkim i sprawdzamy równość dwóch wskaźników. Dzięki.

+10

Bez zamierzonego braku szacunku zostanie to omówione w pierwszych kilku rozdziałach każdej wprowadzającej książki w języku C++. Czy mogę zaproponować ci skorzystanie z jednego? –

+0

dobrze studiuję od cplusplus.com i mają ten przykład. – infinitloop

+4

"* Uczę się od cplusplus.com *" To twój pierwszy błąd. Witryna nie jest dobrym odnośnikiem, a ** w szczególności nie ** dobrym zasobem edukacyjnym. – ildjarn

Odpowiedz

33

Aby rozpocząć, należy pamiętać, że

this 

to specjalny wskaźnik (== adres pamięci) do klasy jej w. pierwsze, obiekt jest instancja:

CDummy a; 

Następnie wskaźnik jest tworzony:

CDummy *b; 

Następny adres pamięci a jest przypisany do wskaźnika b:

b = &a; 

Następnie metoda CDummy::isitme(CDummy &param) jest nazywana:

b->isitme(a); 

Test jest oceniany wewnątrz tej metody:

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

Oto skomplikowana część. param jest obiektem typu CDummy, ale &param jest adresem pamięci param. Tak więc adres pamięci paramu jest testowany na inny adres pamięci o nazwie "this". Jeśli skopiujesz adres pamięci obiektu, do którego ta metoda zostanie wywołana z argumentu tej metody, spowoduje to true.

Ten rodzaj oceny jest zwykle wykonywane przy przeciążeniu konstruktor kopiujący

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 
    } 
} 

pamiętać także wykorzystanie *this, gdzie this jest będącego dereferencjonowane. Oznacza to, że zamiast zwracać adres pamięci, zwróć obiekt znajdujący się pod tym adresem pamięci.

+1

Naprawdę dobrze się załamuję, dziękuję. – tetris11

37

& ma jeden więcej znaczeń:

1) odbierze adres zmiennej

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

2) przechodzą argument w odniesieniu do funkcji

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) zadeklaruj zmienną referencyjną

4) bitowe i operator

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

n) inne ???

+4

I bit-mądry * i * –

+1

Pytanie jest specyficzne. Co to znaczy w kodzie w Q? –

+1

Nie mam nic przeciwko spadkom, ale chciałbym się dowiedzieć, dlaczego mogę się czegoś nauczyć. –

1

Cóż CDummy& param, który jest zadeklarowany jako parametr funkcji CDummy::isitme, jest w rzeczywistości reference, który jest "podobny" do wskaźnika, ale inny. Ważne jest, aby pamiętać o referencjach, że wewnątrz funkcji, w których są przekazywane jako parametry, naprawdę masz odniesienie do instancji typu, a nie "po prostu" wskaźnik do niego. Tak więc, zgodnie z komentarzem, "&" działa tak jak w C, pobiera adres przekazanego argumentu i porównuje go z this, który jest oczywiście wskaźnikiem do instancji klasy metoda jest wywoływana.

Powiązane problemy