Vraag Waarom 'dit' is een aanwijzer en geen referentie?


Ik was de antwoorden op deze vraag aan het lezen C ++ voors en tegens en kreeg deze twijfel tijdens het lezen van de opmerkingen.

programmeurs vinden het vaak verwarrend dat 'dit' een aanwijzer is maar geen referentie. een andere verwarring is de reden waarom "hallo" niet van het type std is :: string maar evalueert naar een char const * (pointer) (na array naar pointerconversie) - Johannes Schaub - litb 22 december '08 om 1:56

Dat toont alleen aan dat het niet dezelfde conventies gebruikt als andere (later) talen. - le dorfier dec 22 '08 om 3:35 uur

Ik noem het "dit" ding echter een vrij triviaal probleem. En oeps, bedankt voor het vangen van een paar fouten in mijn voorbeelden van ongedefinieerd gedrag. :) Hoewel ik niet begrijp welke informatie over grootte te maken heeft met iets in de eerste. Een wijzer mag simpelweg niet naar buiten wijzen toegewezen geheugen - jalf 22 december 2008 om 4:18

Is dit een constante poiner? - yesraaj dec 22 '08 om 6:35 uur

dit kan constant zijn als de methode const int getFoo () const; <- in het kader van getFoo is 'dit' constant en daarom alleenleesbaar. Dit voorkomt bugs en biedt een zekere mate van garantie aan de beller dat het object niet zal veranderen. - Doug T. 22 december 2008 om 16:42 uur

je kunt "dit" niet opnieuw toewijzen. dat wil zeggen dat je "this = & other" niet kunt doen, omdat dit een rvalue is. maar dit is van het type T *, niet van het type T const. het is een niet-constante aanwijzer. als je een const-methode gebruikt, is dit een aanwijzer voor const. T const. maar de wijzer zelf is nonconst - Johannes Schaub - litb 22 december '08 om 17:53 uur

denk aan "dit" als volgt: # define this (this_ + 0) waarbij de compiler "this_" creëert als een verwijzing naar het object en "this" een sleutelwoord maakt. u kunt "dit" niet toewijzen omdat (this_ + 0) een rwaarde is. natuurlijk is dat niet hoe het is (er is geen dergelijke macro), maar het kan helpen het te begrijpen - Johannes Schaub - litb 22 december 2008 om 17:55 uur

Mijn vraag is, waarom this is een aanwijzer een niet een referentie? Een speciale reden om er een aanwijzer van te maken?


Nog een paar argumenten waarom this een referentie zijn zou logisch zijn:

  • Overwegen Item 1 van More Effective C++: gebruik referenties als gegarandeerd is dat we een geldig object hebben, dus geen NULL (mijn interpretatie).
  • Bovendien worden verwijzingen beschouwd als veiliger dan verwijzingen (omdat we het geheugen niet kunnen opschroeven met een verdwaalde aanwijzer).
  • Ten derde, de syntaxis voor toegang tot referenties (.) is een beetje leuker en korter dan het benaderen van wijzers (-> of (*)).

151
2018-03-14 14:37


oorsprong


antwoorden:


Toen de taal voor het eerst evolueerde, waren er in vroege releases met echte gebruikers geen verwijzingen, alleen verwijzingen. Er zijn verwijzingen toegevoegd toen overbelasting door de operator werd toegevoegd, omdat hiervoor verwijzingen naar consistent werken nodig zijn.

Een van de toepassingen van this is voor een object om een ​​aanwijzer naar zichzelf te krijgen. Als het een referentie was, zouden we moeten schrijven &this. Aan de andere kant, wanneer we een toewijzingsoperator schrijven, moeten we dat doen return *this, wat er eenvoudiger zou uitzien return this. Dus als je een schone lei had, zou je het hoe dan ook kunnen betwisten. Maar C ++ evolueerde geleidelijk in reactie op feedback van een gemeenschap van gebruikers (zoals de meeste succesvolle dingen). De waarde van achterwaartse compatibiliteit overweldigt de kleine voordelen / nadelen die eruit voortvloeien volledig this een referentie of een aanwijzer zijn.


147
2018-03-14 14:41



Een beetje laat op het feest ... Recht uit de mond van het paard, Dit is wat Bjarne Stroustrup te zeggen heeft (wat in essentie wordt herhaald in of ontleend aan het boek "Design and Evolution of C ++"):

Waarom is "dit" geen referentie?

Omdat "dit" werd geïntroduceerd in C ++ (echt in C met klassen) voordat er verwijzingen werden toegevoegd. Ook heb ik "dit" gekozen om Simula-gebruik te volgen, in plaats van het (later) gebruik van "self" door Smalltalk.


94
2018-03-15 19:52



Ongeacht hoe we hier zijn gekomen, ik denk dat het geluk heeft deze is een aanwijzer en geen referentie, omdat dit helpt om 'logisch' te zijn dat je het kunt verwijderen het:

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

Ik denk dat dit een geval is waar C ++, zonder noodzakelijkerwijs door het ontwerp te zijn, beter is zoals het is.


-2
2018-03-16 11:52



De C ++ -standaard stelt dat

9.3.2 / 1

In het lichaam van een niet-statische (9.3)   lidfunctie, het sleutelwoord dit is a   niet-lvalue-expressie waarvan de waarde is   het adres van het object waarvoor   de functie wordt genoemd. Het soort   dit in een ledenfunctie van een klasse X   is X *. Als de led-functie is   verklaard const, het type hiervan is   const X *, als de ledfunctie is   verklaard vluchtig, het type hiervan is   vluchtige X *, en als het lid   functie wordt const volatile verklaard,   het type hiervan is const volatile X *.

Maar in andere referenties werd het iets anders gevonden ... dus iemand nam initiatief en schoot een mail naar Mr. Stroustrup. Het gesprek dat volgde, is te vinden hier.


-2
2017-10-10 06:27