Was ist die eigentliche Bedeutung von Keyword "this"?

8

Ich habe zwei Fragen zu C ++:

In vielen Lehrbüchern ist das Schlüsselwort this ein Zeiger auf das aufrufende Objekt . Richtig?

Da ich gerne mit Codierung spiele, habe ich den folgenden einfachen Code geschrieben:

%Vor%

Der obige Code erzeugt die folgende Ausgabe:

%Vor%

Wenn this auf das aufrufende Objekt zeigt, sollte die zweite Zeile von sizeof(*this) 8 anstatt 4 ausgeben, da das aufrufende Objekt b ist? Was passiert hier eigentlich? Wurde this herabgestuft? !!!!

Wenn this zurückgestuft wurde, um Base einzugeben, wie ruft this->f() die korrekte Funktion auf? Ich bin wirklich verwirrt.

    
Eto700 05.07.2011, 21:55
quelle

4 Antworten

12
%Vor%

Die wichtige Unterscheidung, die getroffen werden muss, ist, dass sizeof ein Kompilierzeit -Operator ist, kein Laufzeitoperator . Der Compiler interpretiert den Ausdruck sizeof(*this) als "die Größe des Objekts, auf das this zeigt", was im Bereich von Base::g ein Objekt vom Typ Base wäre. Der Compiler wird diese Anweisung im Wesentlichen wie folgt neu schreiben, weil er weiß, dass die Größe von Base vier Bytes ist:

%Vor%     
Adam Maras 05.07.2011, 22:02
quelle
1

Base kann nichts, was Teil von abgeleiteten Objekten ist, nicht sehen / darauf zugreifen / wissen, also meldet sizeof nur den Teil des Objekts, der für sie sichtbar ist. Genauer gesagt, sizeof in einer Methode von Base kann nicht wissen, dass es Unterklassen gibt oder geben wird (Sie können Base ableiten, ohne sie neu zu kompilieren), so dass sie nur den Teil weiß es. ( sizeof wird zur Kompilierzeit berechnet, nicht zur Laufzeit.)

    
geekosaur 05.07.2011 21:58
quelle
0

Die korrekte Funktion f wird aufgerufen, weil Base::f virtuell ist. Dies teilt dem Compiler mit, dass, wenn ein Aufruf von Base*->f() angefordert wird, die tatsächliche Adresse des Aufrufers in der vtable des tatsächlichen Objekts nachgeschlagen wird, dessen Member Sie aufrufen.

Der Typ der this ist Base* , weshalb sizeof(*this) == sizeof(Base) , aber seine vtable gehört zu einem abgeleiteten Objekt und daher der Funktionsaufruf an f die Überschreibung.

    
Kerrek SB 05.07.2011 22:01
quelle
0

this ist ein Konstantwertzeiger auf das Objekt, für das die Funktion ein nicht statisches Element ist. Dies bedeutet, dass this nur in nicht statischen Membern einer Klasse verwendet werden kann, um ein brauchbarer Wert zu sein. Denken Sie daran: Sie müssen eine Objektinstanz verwenden, um eine nicht statische Elementfunktion aufzurufen (instance.function oder instance- & gt; -Funktion). this ist ein Zeiger auf "Instanz".

Der Grund, warum die Größe nie die 8 ist, die Sie erwarten, ist, weil g ein Mitglied der Klasse Base ist. Für g ist this vom Typ Base *const und daher ist *this vom Typ Base& . Das sizeof(Base) ist 4. Auch wenn es ein virtuelles Mitglied wäre, würde sich dies nicht ändern; Der Typ für diese Implementierung von g wäre immer Base *const . Praktisch überschriebene Versionen würden unterschiedliche Typen haben, aber nur den Typ der Klasse, die sie implementiert.

Der Typ

this folgt nicht dem Polymorphismus; es hat genau und nur den Typ, mit dem die Funktion definiert wurde.

    
Nicol Bolas 05.07.2011 21:57
quelle

Tags und Links