Perché "questo" è un puntatore e non un riferimento?
Domanda
Stavo leggendo le risposte a questa domanda Pro e contro C ++ e ho ottenuto questo dubbio durante la lettura dei commenti.
i programmatori trovano spesso confuso che " questo " è un puntatore ma non un riferimento. un'altra confusione è perché " ciao " non è di tipo std :: string ma restituisce un carattere const * (puntatore) (dopo la conversione da array a puntatore) & # 8211; Johannes Schaub - litb 22 dic .08 alle 1:56
Ciò dimostra solo che non utilizza le stesse convenzioni di altre lingue (successive). & # 8211; le dorfier il 22 dicembre 2008 alle 3:35
Chiamerei il " questo " cosa 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. A un puntatore semplicemente non è consentito puntare fuori dalla memoria allocata & # 8211; jalf 22 dic08 alle 4:18
È un costante poiner? & # 8211; yesraaj, 22 dicembre 2008 alle 6:35
questo può essere costante se il metodo è const int getFoo () const; < - nell'ambito di getFoo, " questo " è costante ed è quindi di sola lettura. Ciò previene i bug e fornisce al chiamante un certo livello di garanzia che l'oggetto non cambierà. & # 8211; Doug T., 22 dicembre 2008 alle 16:42
non puoi riassegnare " questo " ;. cioè non puoi fare " this = & amp; altro; " ;, 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 puntatore stesso non è <<>> 8211; Johannes Schaub - litb 22 dic .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 " questo " 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 & # 8211; Johannes Schaub - litb 22 dic08 alle 17:55
La mia domanda è: perché this
un puntatore non è un riferimento? Qualche motivo particolare per renderlo un puntatore?
Alcuni ulteriori argomenti per cui Item 1
essere un riferimento avrebbe senso:
- Considera
More Effective C++
da.
: 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ù gradevole e più breve dell'accesso ai puntatori ((*)
o <=>).
Soluzione
Quando la lingua si è evoluta per la prima volta, nelle prime versioni con utenti reali, non c'erano riferimenti, solo puntatori. 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 su 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 come return this
. Quindi se avessi una tabula rasa, potresti discuterne in entrambi i modi. Ma il C ++ si è evoluto gradualmente in risposta al feedback di una comunità di utenti (come la maggior parte delle cose di successo). Il valore della compatibilità con le versioni precedenti supera totalmente i piccoli vantaggi / svantaggi derivanti dal fatto che <=> è un riferimento o un puntatore.
Altri suggerimenti
Un po 'in ritardo alla festa ... Direttamente dalla bocca del cavallo, ecco cosa ha Bjarne Stroustrup per dire (che è essenzialmente ripetuto o tratto dalla " Design and Evolution of C ++ " book):
Perché è " questo " non un riferimento?
Perché " questo " è stato introdotto in C ++ (in realtà in C con Classi) prima di aggiungere riferimenti. Inoltre, ho scelto & Quot; questo & Quot; seguire l'utilizzo di Simula, piuttosto che l'uso (successivo) di Smalltalk di " self " ;.
Lo standard C ++ afferma che
9.3.2 / 1
Nel corpo di un non statico (9.3) membro, la parola chiave this è a espressione non lvalue il cui valore è l'indirizzo dell'oggetto per il quale la funzione è chiamata. Il tipo di questo in una funzione membro di una classe X è X *. Se la funzione membro è const dichiarata, il tipo di questo è const X *, se la funzione membro è dichiarato volatile, il tipo di questo è volatile X * e se il membro la funzione è dichiarata volatile, il tipo di questo è const volatile X *.
Ma in altri riferimenti, è stato trovato qualcos'altro .. così qualcuno ha preso l'iniziativa e ha inviato una mail a Mr. Stroustrup . La conversazione che seguì può essere trovata qui .