Warum ist “das” ein pointers und keine Referenz?

Ich las die Antworten auf diese Frage C ++ Vor- und Nachteile und bekam diese Zweifel beim Lesen der Kommentare.

Programmierer finden es häufig verwirrend, dass “dies” ein pointers ist, aber keine Referenz. Eine weitere Verwirrung ist, warum “Hallo” nicht vom Typ std :: string ist, sondern zu einem char const * (pointers) (nach der Konvertierung von Array zu pointers) – Johannes Schaub – Litb 22. Dezember 08 um 1:56

Das zeigt nur, dass es nicht die gleichen Konventionen wie andere (spätere) Sprachen verwendet. – le dorfer 22. Dezember 08 um 03:35 Uhr

Ich würde das “dieses” Ding jedoch ein ziemlich triviales Problem nennen. Und oops, vielen Dank, dass Sie ein paar Fehler in meinen Beispielen für undefiniertes Verhalten gefunden haben. 🙂 Obwohl ich nicht verstehe, welche Informationen über Größe mit irgendetwas in der ersten zu tun hat. Ein pointers darf einfach nicht außerhalb zugewiesenen Speicher zeigen – jalf 22. Dezember 08 um 04.18 Uhr

Ist das ein konstanter Poiner? – yesraaj 22. Dezember 2008 um 06.35 Uhr

Dies kann konstant sein, wenn die Methode const int getFoo () const; <- im Bereich von getFoo ist "this" konstant und daher readonly. Dies verhindert Fehler und bietet dem Anrufer eine gewisse Garantie, dass das Objekt nicht geändert wird. – Doug T. 22. Dezember um 16:42 Uhr

Sie können “dieses” nicht neu zuweisen. dh du kannst “this = & other;” nicht machen, weil dies ein rvalue ist. aber das ist vom Typ T *, nicht vom Typ T const. dh es ist ein nicht konstanter pointers. Wenn Sie in einer Konst-Methode sind, dann ist es ein pointers auf Const. T const. aber der pointers selbst ist nonconst – Johannes Schaub – litb 22. Dezember 08 um 17:53

Denken Sie an “das” so: #define this (this_ + 0), wo der Compiler “this_” als pointers auf das Objekt erstellt und “this” zu einem Schlüsselwort macht. Sie können “this” nicht zuweisen, da (this_ + 0) ein rvalue ist. Natürlich ist das nicht so (es gibt kein solches Makro), aber es kann helfen, es zu verstehen – Johannes Schaub – Litb 22. Dezember 08 um 17:55 Uhr

Meine Frage ist, warum this ein pointers ist und keine Referenz? Irgendein besonderer Grund dafür, es zu einem pointers zu machen?


Einige weitere Argumente, warum this eine Referenz wäre, würde Sinn machen:

  • Betrachte Item 1 von More Effective C++ : Benutze Referenzen, wenn garantiert ist, dass wir ein gültiges Objekt haben, dh kein NULL (meine Interpretation).
  • Darüber hinaus gelten Referenzen als sicherer als pointers (weil wir den Speicher nicht mit einem Streuzeiger verschrauben können).
  • Drittens ist die Syntax für den Zugriff auf Referenzen ( . ) Ein wenig netter und kürzer als der Zugriff auf pointers ( -> oder (*) ).

    Als sich die Sprache zum ersten Mal entwickelte, gab es in frühen Releases mit echten Benutzern keine Verweise, nur pointers. Bei der Überladung des Operators wurden Verweise hinzugefügt, da Referenzen erforderlich sind, um konsistent zu arbeiten.

    Eine this ist, dass ein Objekt einen pointers auf sich selbst erhält. Wenn es eine Referenz wäre, müssten wir &this schreiben. Auf der anderen Seite, wenn wir einen Zuweisungsoperator schreiben, müssen wir return *this , was einfacher aussehen würde, als return this . Wenn Sie also ein unbeschriebenes Blatt hatten, könnten Sie es in beide Richtungen argumentieren. Aber C ++ entwickelte sich allmählich als Reaktion auf das Feedback von einer Gemeinschaft von Benutzern (wie die meisten erfolgreichen Dinge). Der Wert der Rückwärtskompatibilität überlagert die kleinen Vorteile / Nachteile vollständig, die daraus resultieren, dass es sich um eine Referenz oder einen pointers handelt.

    Ein wenig zu spät zur Party … Hier ist, was Bjarne Stroustrup zu sagen hat (was im Wesentlichen im Buch “Design und Evolution von C ++” wiederholt wird):

    Warum ist “das” keine Referenz?

    Weil “dies” in C ++ eingeführt wurde (wirklich in C mit Classes), bevor Referenzen hinzugefügt wurden. Außerdem habe ich “dieses” gewählt, um Simula zu verwenden, anstatt die (spätere) Smalltalk-Verwendung von “self”.

    Unabhängig davon, wie wir hierher gekommen sind, ich denke, es ist ein Glück, dass dies ein pointers und keine Referenz ist, da dies hilft, dass es “sinnvoll” ist, dass Sie es löschen können:

     void A::f () { delete &this; } 

    Ich denke, das ist ein Fall, in dem C ++, ohne es unbedingt zu wollen, besser ist, als es ist.

    Der C ++ – Standard besagt, dass

    9.3.2 / 1

    Im Rumpf einer nichtstatischen (9.3) Elementfunktion ist das Schlüsselwort dies ein Nicht-Lvalue-Ausdruck, dessen Wert die Adresse des Objekts ist, für das die function aufgerufen wird. Der Typ von diesem in einer Mitgliedsfunktion einer class X ist X *. Wenn die Elementfunktion als const deklariert ist, lautet der Typ const X *, wenn die Elementfunktion als flüchtig deklariert ist, ist der Typ flüchtig X *, und wenn die Elementfunktion als const volatile deklariert ist, lautet der Typ const flüchtiges X *.

    Aber in anderen Referenzen, es wurde etwas anderes gefunden. So ergriff jemand Initiative und schoss eine Mail an Herrn Stroustrup . Die folgende Konversation finden Sie hier .