Perché "questo" è un puntatore e non un riferimento?


183

Stavo leggendo le risposte a questa domanda Pro e contro C ++ e ho avuto questo dubbio durante la lettura dei commenti.

i programmatori trovano spesso confuso che "questo" sia un puntatore ma non un riferimento. un'altra confusione è il motivo per cui "ciao" non è di tipo std :: string ma restituisce un carattere const * (puntatore) (dopo la conversione da array a puntatore) - Johannes Schaub - litb 22 dic08 '08 alle 1:56

Ciò dimostra solo che non utilizza le stesse convenzioni di altre lingue (successive). - Le Dorfier, 22 dicembre 2008 alle 3:35

Definirei "questa" cosa un problema piuttosto banale. E oops, grazie per aver rilevato alcuni errori nei miei esempi di comportamento indefinito. :) Anche se non capisco quali informazioni sulla dimensione hanno a che fare con qualcosa nel primo. Semplicemente, a un puntatore non è consentito puntare fuori dalla memoria allocata - jalf 22 dic08 alle 4:18

È un costante poiner? - yesraaj, 22 dicembre 2008 alle 6:35

questo può essere costante se il metodo è const int getFoo () const; <- nell'ambito di getFoo, "this" è costante ed è quindi di sola lettura. Ciò previene i bug e fornisce al chiamante un certo livello di garanzia che l'oggetto non cambierà. - Doug T., 22 dicembre 2008 alle 16:42

non puoi riassegnare "questo". cioè non puoi fare "this = & other;", perché questo è un valore. ma questo è di tipo T *, non di tipo T const. cioè è un puntatore non costante. se sei in un metodo const, allora è un puntatore a const. T const. ma l'indicatore stesso è nonconst - Johannes Schaub - litb 22 dic08 alle 17:53

pensa a "questo" in questo modo: #definisci questo (this_ + 0) dove il compilatore crea "this_" come un puntatore all'oggetto e rende "this" una parola chiave. non puoi assegnare "questo" perché (this_ + 0) è un valore. ovviamente non è così (non esiste una tale macro), ma può aiutare a capirlo - Johannes Schaub - litb 22 dic0808 alle 17:55

La mia domanda è: perché thisun puntatore non è un riferimento? Qualche motivo particolare per renderlo un puntatore?


Alcuni ulteriori argomenti sul perché thisessere un riferimento avrebbe senso:

  • Considera Item 1da More Effective C++ : usa i riferimenti quando è garantito che abbiamo un oggetto valido, cioè non un NULL (la mia interpretazione).
  • Inoltre, i riferimenti sono considerati più sicuri dei puntatori (perché non possiamo rovinare la memoria con un puntatore vagante).
  • In terzo luogo, la sintassi per l'accesso ai riferimenti ( .) è un po 'più bella e più breve dell'accesso ai puntatori ( ->o (*)).

5
@paulm Cosa realizzerebbe questo "hack"? Non thisvaluta sempre true?
— iFreilicht,

6
@paulm Non penso che sia effettivamente valido C ++. Il richiamo di metodi su un nullptr a un oggetto comporta un comportamento indefinito.
— Antred,

5
@paulm Forse funziona in alcuni casi, ma immagina se il metodo fosse virutale. Come si può fare una ricerca v-table senza oggetto?
— Jason Creighton,

3
@paulm Se l'hai visto nel codice di produzione, abbandona la nave! Questo è UB.
— Alice,

6
Lo lascerò qui ... (da afxwin2.inl dell'MFC):_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
— Christopher Oicles,

Risposte:


176

Quando il linguaggio si è evoluto per la prima volta, nelle prime versioni con utenti reali, non c'erano riferimenti, solo indicazioni. Sono stati aggiunti riferimenti quando è stato aggiunto il sovraccarico dell'operatore, poiché richiede riferimenti per funzionare in modo coerente.

Uno degli usi di thisè che un oggetto ottenga un puntatore a se stesso. Se fosse un riferimento, dovremmo scrivere &this. D'altra parte, quando scriviamo un operatore di assegnazione dobbiamo return *this, che sembrerebbe più semplice return this. Quindi se avessi una lavagna vuota, potresti discuterne in entrambi i modi. Ma il C ++ si è evoluto gradualmente in risposta al feedback di una comunità di utenti (come le cose di maggior successo). Il valore della compatibilità con le versioni precedenti supera totalmente i piccoli vantaggi / svantaggi derivanti thisdall'essere un riferimento o un puntatore.


4
Bene, è anche utile che un oggetto ottenga un riferimento a se stesso. Direi che è un uso più comune. Comunque, il motivo principale è come hai detto, i riferimenti non esistevano quando hanno creato il puntatore "questo".
— jalf

20
E, se questo fosse un riferimento, sarebbe difficile sovraccaricare operator &per fare qualcosa di utile. Dovrebbe esserci una sintassi speciale per ottenere l'indirizzo di questo che non dovrebbe passare operator &.
— Onnipotente il

10
@conio - potresti voler controllare che la prossima volta che ti troverai in un compilatore C ++! :) Qualcosa del tipo:int n = 5; int &r = n; int *p = &r; std::cout << *p;
— Daniel Earwicker,

14
@Onniversario potresti scrivere &reinterpret_cast<char&>(this);per ottenere l'indirizzo reale per il sovraccarico operator&(in effetti, questo è una specie di cosa boost::addressof).
— Johannes Schaub - litb

9
Dal momento che non ha davvero senso thisessere nullo, mi sembra che un riferimento sia davvero più appropriato.
— Ponkadoodle,

114

Un po 'tardi alla festa ... Direttamente dalla bocca del cavallo, ecco cosa ha da dire Bjarne Stroustrup (che è essenzialmente ripetuto o preso dal libro "Design and Evolution of C ++"):

Perché " this" non è un riferimento?

Perché "questo" è stato introdotto in C ++ (in realtà in C con le classi) prima che i riferimenti fossero aggiunti. Inoltre, ho scelto " this" per seguire l'uso di Simula, piuttosto che l'uso (successivo) di "self" di Smalltalk.


2
Sì, il sé sarebbe stato carino per coerenza con altre lingue, oh beh.
— Pilkch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.