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.