Zeiger
-
Ic hverstehe nicht warum die Adresse der Funktion im Zeiger steht, müsst nicht eigentlich der Rückgabewert der Funktion im Zeiger stehen. Der Operator -> kombiniert ja Dereferenzierung und Memberzugriff.
-
C++Pete schrieb:
Ic hverstehe nicht warum die Adresse der Funktion im Zeiger steht
Tut sie nicht. Der Zeiger ist die Adresse des Objektes, mit dem du ihn initialisiert hast (new demo).
müsst nicht eigentlich der Rückgabewert der Funktion im Zeiger stehen.
Nein, der Zeiger ist die Adresse des Objektes, mit dem du ihn initialisiert hast (new demo).
Der Operator -> kombiniert ja Dereferenzierung und Memberzugriff.
Korrekt. zeiger->member bedeutet exakt das gleiche wie (*zeiger).member.
-
Also steht nach Initialisierung des Zeiger die Adresse des Objektes demo drin. Und was steht im Zeiger nach Anwendung des -> Operators?
-
Immer noch dasselbe.
-
Das fällt mir schwer zu glauben. Ich arbeite mich derzeit in Quellcode ein.
Dort kommen Kontrollstrukturen wie zum Beispiel:"if (!controller ->GetManufactererHardwareVersion(getMaHaVer))
return false"vor, wobei controller der Zeiger ist und die Funktion GetManufactererHardwareVersion(get...) entwerder TRUE oder FALSE zurückgibt. In dem Zeiger muss in dem Fall doch der Rückgabewert 1 bzw. 0 stehen, anderfalls würde die KOntrollstruktur doch gar nicht funktionieren?
-
Der Zeiger zeigt auf eine Instanz eines Objekt (genauer gesagt: er zeigt auf eine Speicheradresse, an der sich diese Instanz befindet). Das tut er solange, bis dem Zeiger irgendetwas anderes zugewiesen wird.
Der operator-> bewirkt lediglich die Dereferenzierung, d.h. dass das, was nach dem "->" kommt, auf die Instanz angewendet wird, die sich an der Speicheradresse befindet.
edit:
C++Pete schrieb:
In dem Zeiger muss in dem Fall doch der Rückgabewert 1 bzw. 0 stehen, anderfalls würde die KOntrollstruktur doch gar nicht funktionieren?
wieso in dem Zeiger? Du rufst eine Methode auf, die einen Wert zurückliefert. Dieser Rückgabewert wird ausgewertet.
-
Vielen Dank für deine Antwort!
-
Angenommen ich habe eine Funktion, welche folgendermaßen deklariert ist:
bool AddController(const std:: string& cfgData);
Es handelt sich also um eine Funktion, welche einen bool'schen Wert zurückgibt und die konstante Variable cfgData vom Datentyp String als Eingangsvariable aufnimmt. Bedeutet das Zeichen "&" hinter dem String, dass nur die Adresse dieser Variablen übernommen wird? Wenn ja, was bringt mir das? Vielen Dank für eure Hilfe!
-
In diesem Fall steht das "&" für "Referenz".
-
Und welchen Vorteil bringt mir es, eine Eingangsvariable als Referenz zu deklarieren?
-
Im Vergleich zum Zeiger: Eine Referenz kann nicht NULL sein.
Im Vergleich zur Übergabe als Wert: Es musst nicht kopiert werden.
-
C++Pete schrieb:
Und welchen Vorteil bringt mir es, eine Eingangsvariable als Referenz zu deklarieren?
Das nennt sich call-by-reference (manchmal auch pass-by-reference). D.h. das Argument, das du an deine Funktion übergibst, wird nicht kopiert, sondern du hast eine Referenz auf das Argument. Das wiederum bedeutet, du arbeitest in deiner Funktion mit der originalen Variable (von der aufrufenden Funktion). Das const ist wichtig, um sicherzustellen, dass die originale Variable in deiner Funktion nicht verändert wird. Der offensichtliche Vorteil ist also, eine Kopie zu vermeiden.
Im Übrigen solltest du dir eine Referenz als Aliasname für eine Variable vorstellen. Eine Referenz ist nämlich kein Objekt, sie belegt kein Speicher. Sie ist einfach nur ein zweiter Name für etwas.
-
Was auch noch zu erwähnen ist: Referenzen als Member büßen ihr Flavour ein, daher sollten Member meistens eher Zeiger sein (gerade, weil man dann Zuweisungen dieser Klasse geeigneter implementieren kann, Referenzen können ihren Referent nicht ändern. Von camper hier beschrieben:
Referenzen als Member sind fast immer ein Designfehler, sie bieten gegenüber konstanten Zeigern keine Vorteile (Syntax ist irrelevant, schliesslich ist die Referenz nicht public), dafür mehrere Nachteile:
- man kann keine Zeiger-auf-Member bilden,
- es gilt nicht mehrsizeof(Member1)+sizeof(Member2)+... <= sizeof(Klasse)