2013-06-17 7 views
33
struct Foo 
{ 
void f() 
{ 
// (*) 
} 
}; 

Was ist der Typ von "this" in der mit (*) markierten Zeile?Art von "das" in C++?

Ist es const Foo * oder Foo *?

+5

es ist wahrscheinlich 'Foo * const' –

+6

@TomKnapen nein, es ist nicht: http://stackoverflow.com/questions/16102143/c-the-this-pointer-is-always-const/ –

+1

Wenn es "const Foo *" wäre, würde das bedeuten, dass du das Mitglied va nicht ändern kannst Verweise auf das Objekt (stellen Sie sich vor, dass alle Zugriffe das 'this->' explizit angegeben haben).Das ist nicht die Absicht, es sei denn, Sie deklarieren die Elementfunktion selbst als const. – Steve314

Antwort

71

n3376 9.3.2/1

In dem Körper einer nicht-statisch (9.3) Mitgliedsfunktion, das Schlüsselwort dies ist ein Ausdruck prvalue dessen Wert ist die Adresse des Objekts für welche die Funktion aufgerufen wird.

Der Typ dieser in einer Elementfunktion von eine Klasse X ist X *. Wenn die Memberfunktion als const deklariert ist, lautet der Typ const X *, wenn die Memberfunktion als flüchtig deklariert ist, deren Typ flüchtig X * ist, und wenn die Memberfunktion const volatile deklariert ist ist const flüchtig X *.

+2

Das lässt mich wundern, warum sie 'this' nicht zu einem konstanten Zeiger gemacht haben ... Irgendein besonderer Grund? –

+17

@TomKnapen 'this' ist ein r-Wert, daher können Sie ihn nicht ändern. In den meisten Fällen verhält es sich wie 'X * const'. Aber Sie können zum Beispiel seine Adresse nicht nehmen. – Angew

+3

@TomKnapen: Nein. Im Nachhinein sollte es eine Referenz sein, kein Zeiger. Aber 'this' ist älter als Referenzen, und die C++ - Tradition, bestehenden Code nicht zu brechen, ist wirklich alt. – MSalters

-5

this bezieht sich auf das aktuelle Objekt. Der Typ this in C++ ist Foo *const.

5

Innen f hat thisFoo * geben, weil f keine Funktion const Mitglied ist.

Sie können f auf einem Objekt const Foo nicht aufrufen. Im Folgenden ist fehlerhaft:

const Foo obj; 
obj.f(); 

Das ist genau das, weil im Innern Foo::f, die this Zeiger Foo * statt const Foo *, und so der Funktionsaufruf fordert einen Zeiger Umwandlung, die einen Qualifier verwirft.

Der Zeiger this selbst ist keine Variable. Es ist nicht zuweisbar, aber nicht wegen eines const Qualifiers. Es gibt keine Deklaration wie z. B. Foo *const this. Ein this Ausdruck ist einfach kein Wert, als eine Regel der Sprache.

Der Zeiger this unterscheidet sich nicht sehr von &obj.

+1

Eine schönere, pädagogischere Erklärung als ein Standardangebot. +1 – StellarVortex

2

Der Typ hängt von der Elementfunktion ab.

Zum Beispiel für eine Klasse X, wenn die Mitgliederfunktionen

1) const, dann ist dies vom Typ const X *

2) flüchtigen, dann ist diese volatil X * etc

sonst ist es X *