[c++] Perché 'questo' è un puntatore e non un riferimento?



1 Answers

Un po 'tardi per la festa ... Direttamente dalla bocca del cavallo, ecco cosa Bjarne Stroustrup ha da dire (che è essenzialmente ripetuto nel libro "Design ed Evolution of C ++"):

Perché "questo" non è un riferimento?

Perché "questo" è stato introdotto in C ++ (veramente in C con Classi) prima che i riferimenti venissero aggiunti. Inoltre, ho scelto "questo" per seguire l'uso di Simula, piuttosto che l'uso (successivo) di Smalltalk di "sé".

Question

Stavo leggendo le risposte a questa domanda C ++ pro e contro e ho ottenuto questo dubbio mentre leggevo i 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 char const * (puntatore) (dopo la conversione da matrice a puntatore) - Johannes Schaub - litb 22 dic08 alle 1:56

Questo dimostra che non usa le stesse convenzioni delle altre lingue (successive). - Le Dorfier 22 dicembre 08 alle 3:35

Chiamerei la "questa" cosa piuttosto banale. E ops, grazie per aver catturato alcuni errori nei miei esempi di comportamento indefinito. :) Sebbene non capisco quali informazioni sulla dimensione abbiano a che fare con qualcosa nel primo. Un puntatore non può semplicemente puntare all'esterno della memoria allocata - jalf 22 dicembre 08 alle 4:18

È un poeta costante? - yesraaj 22 dicembre 08 alle 06:35

questo può essere costante se il metodo è const int getFoo () const; <- nell'ambito di getFoo, "questo" è costante ed è quindi di sola lettura. Questo impedisce bug e fornisce un certo livello di garanzia al chiamante che l'oggetto non cambierà. - Doug T. 22 dicembre 08 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 il pointer stesso non è coerente - Johannes Schaub - litb 22 dicembre 08 alle 17:53

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

La mia domanda è, perché this è un puntatore e non un riferimento? Qualche ragione particolare per renderlo un puntatore?

Alcuni ulteriori argomenti per cui this riferimento sarebbe sensato:

  • Considera l' Item 1 da 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 accedere ai riferimenti ( . ) È un po 'più bella e più corta dell'accesso ai puntatori ( -> o (*) ).



Indipendentemente da come siamo arrivati ​​qui, penso che sia una fortuna che questo sia un puntatore e non un riferimento in quanto ciò aiuta a "dare un senso" che è possibile eliminarlo :

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

Penso che questo sia un caso in cui senza necessariamente essere di progettazione, il C ++ è meglio così com'è.




Related