Wie funktioniert das kaufmännische Und-Zeichen (&) in C++? [duplicate]

Lesezeit: 3 Minuten

Wie funktioniert das kaufmannische Und Zeichen in C duplicate
Endlosschleife

Mögliches Duplikat:

Was sind die Unterschiede zwischen Zeigervariable und Referenzvariable in C++?

Das verwirrt mich:

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 bedeutet & normalerweise die Adresse einer var. Was bedeutet es hier? Ist das eine ausgefallene Art der Zeigernotation?

Der Grund, warum ich annehme, ist eine Zeigernotation, weil dies schließlich ein Zeiger ist und wir auf Gleichheit von zwei Zeigern prüfen.

Ich studiere von cplusplus.com und sie haben dieses Beispiel.

Wie funktioniert das kaufmannische Und Zeichen in C duplicate
Luchian Grigore

Die & hat mehr als eine Bedeutung:

1) Nehmen Sie die Adresse einer Variablen

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

2) Übergeben Sie ein Argument als Referenz an eine Funktion

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) Deklarieren Sie eine Referenzvariable

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

4) bitweise und Operator

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

n) andere???

  • Und bitweise und

    – Andy Finkenstadt

    13. Januar 2012 um 22:07 Uhr

  • Die Frage ist konkret. Was bedeutet es im Code in der Q?

    – David Heffernan

    13. Januar 2012 um 22:09 Uhr

  • Ich habe nichts gegen Downvotes, aber ich würde gerne wissen warum, damit ich etwas lernen kann.

    – Luchian Grigore

    13. Januar 2012 um 22:13 Uhr

  • Ich dachte, ich wäre ziemlich klar, aber ich akzeptiere Ihre Meinung. Ich dachte, eine gründliche Erklärung würde ihm mehr helfen, als nur auf das Offensichtliche hinzuweisen.

    – Luchian Grigore

    13. Januar 2012 um 22:15 Uhr


  • @DavidHeffernan Ich wusste, dass es für dich offensichtlich war :). Nicht das erste Mal, dass ich dich hier sehe :). Was ich meinte, war, dass ich dachte, ich wäre für ihn ziemlich klar zu verstehen.

    – Luchian Grigore

    13. Januar 2012 um 22:24 Uhr

1646347216 388 Wie funktioniert das kaufmannische Und Zeichen in C duplicate
Rollen

Beachten Sie das zunächst

this

ist ein spezieller Zeiger ( == Speicheradresse) auf die Klasse, in der er sich befindet. Zuerst wird ein Objekt instanziiert:

CDummy a;

Als nächstes wird ein Zeiger instanziiert:

CDummy *b;

Als nächstes wird die Speicheradresse von a wird dem Zeiger zugeordnet b:

b = &a;

Als nächstes die Methode CDummy::isitme(CDummy &param) wird genannt:

b->isitme(a);

Innerhalb dieser Methode wird ein Test ausgewertet:

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

Hier ist der schwierige Teil. param ist ein Objekt vom Typ CDummy, aber &param ist die Speicheradresse von param. Also wird die Speicheradresse von param gegen eine andere Speicheradresse namens “this“. Wenn Sie die Speicheradresse des Objekts, von dem diese Methode aufgerufen wird, in das Argument dieser Methode kopieren, wird dies resultieren true.

Diese Art der Auswertung erfolgt normalerweise beim Überladen des Kopierkonstruktors

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

Beachten Sie auch die Verwendung von *thiswo this ist dereferenziert. Das heißt, anstatt die Speicheradresse zurückzugeben, geben Sie das Objekt zurück, das sich an dieser Speicheradresse befindet.

Nun die CDummy& param die als Parameter der Funktion deklariert ist CDummy::isitme ist eigentlich ein Hinweis das ist “wie” ein Zeiger, aber anders. Wichtig bei Referenzen ist, dass Sie innerhalb von Funktionen, wo sie als Parameter übergeben werden, wirklich eine Referenz auf die Instanz des Typs haben, nicht “nur” einen Zeiger darauf. In der Zeile mit dem Kommentar funktioniert das ‘&’ also genau wie in C, es erhält die Adresse des übergebenen Arguments und vergleicht es mit this was natürlich ein Zeiger auf die Instanz der Klasse ist, für die die Methode aufgerufen wird.

928210cookie-checkWie funktioniert das kaufmännische Und-Zeichen (&) in C++? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy