Uno dei maggiori vantaggi dei riferimenti sui puntatori è la maggiore semplicità e leggibilità. Come sempre, quando semplifichi qualcosa, lo rendi più facile da usare, ma a scapito della flessibilità e del controllo che ottieni con le cose di basso livello (come hanno detto altre persone).
I puntatori sono spesso criticati per essere "brutti".
class* myClass = new class();
Ora ogni volta che lo usi devi prima dereferenziarlo
myClass->Method() or (*myClass).Method()
Nonostante la perdita di leggibilità e l'aggiunta di complessità, le persone avevano ancora bisogno di usare spesso i puntatori come parametri in modo da poter modificare l'oggetto reale (invece di passare per valore) e per il guadagno di prestazioni di non dover copiare oggetti enormi.
Per me questo è il motivo per cui i riferimenti sono "nati" in primo luogo per fornire lo stesso vantaggio dei puntatori ma senza tutta quella sintassi del puntatore. Ora puoi passare l'oggetto reale (non solo il suo valore) E hai un modo più leggibile e normale di interagire con l'oggetto.
MyMethod(&type parameter)
{
parameter.DoThis()
parameter.DoThat()
}
I riferimenti C ++ differivano dai riferimenti C # / Java in quanto una volta assegnato un valore ad esso, non era possibile riassegnarlo (e deve essere assegnato quando è stato dichiarato). Era come usare un puntatore const (un puntatore che non poteva essere reindirizzato a un altro oggetto).
Java e C # sono linguaggi moderni di altissimo livello che hanno ripulito molti dei pasticci accumulati in C / C ++ nel corso degli anni e i puntatori erano sicuramente una di quelle cose che dovevano essere "ripulite".
Per quanto il tuo commento sulla conoscenza dei puntatori ti renda un programmatore più forte, questo è vero nella maggior parte dei casi. Se sai "come" funziona qualcosa invece di usarlo senza saperlo, direi che questo può spesso darti un vantaggio. Quanto di un vantaggio varierà sempre. Dopo tutto, usare qualcosa senza sapere come viene implementato è una delle tante bellezze di OOP e Interfaces.
In questo esempio specifico, cosa ti aiuterebbe sapere sui puntatori con i riferimenti? Capire che un riferimento C # NON è l'oggetto stesso ma punta all'oggetto è un concetto molto importante.
# 1: NON stai passando per valore
Bene per i principianti quando usi un puntatore sai che il puntatore contiene solo un indirizzo, questo è tutto. La variabile stessa è quasi vuota ed è per questo che è così bello passare come argomenti. Oltre al miglioramento delle prestazioni, stai lavorando con l'oggetto reale in modo che le modifiche apportate non siano temporanee
# 2: polimorfismo / interfacce
Quando hai un riferimento che è un tipo di interfaccia e punta a un oggetto, puoi solo chiamare i metodi di quell'interfaccia anche se l'oggetto può avere molte più capacità. Gli oggetti possono anche implementare gli stessi metodi in modo diverso.
Se comprendi bene questi concetti, non credo che ti manchi troppo dal non aver usato i puntatori. Il C ++ è spesso usato come linguaggio per l'apprendimento della programmazione perché a volte è bene sporcarsi le mani. Inoltre, lavorare con aspetti di livello inferiore ti fa apprezzare i comfort di un linguaggio moderno. Ho iniziato con C ++ e ora sono un programmatore C # e sento che lavorare con i puntatori non elaborati mi ha aiutato ad avere una migliore comprensione di ciò che accade sotto il cofano.
Non penso sia necessario che tutti inizino con i puntatori, ma ciò che è importante è che capiscano perché i riferimenti vengono utilizzati al posto dei tipi di valore e il modo migliore per capirlo è guardare al suo antenato, il puntatore.