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 <=>).
È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top