L'un des plus grands avantages des références par rapport aux pointeurs est une plus grande simplicité et une meilleure lisibilité. Comme toujours, lorsque vous simplifiez quelque chose, vous le rendez plus facile à utiliser, mais au prix de la flexibilité et du contrôle, vous obtenez des éléments de bas niveau (comme d'autres personnes l'ont mentionné).
Les pointeurs sont souvent critiqués pour leur «laideur».
class* myClass = new class();
Maintenant, chaque fois que vous l'utilisez, vous devez d'abord le déréférencer soit en
myClass->Method() or (*myClass).Method()
Malgré la perte de lisibilité et l'ajout de complexité, les gens devaient encore utiliser souvent des pointeurs comme paramètres afin de pouvoir modifier l'objet réel (au lieu de passer par valeur) et pour gagner en performances, ne pas avoir à copier des objets énormes.
Pour moi, c'est pourquoi les références sont «nées» en premier lieu pour offrir le même avantage que les pointeurs, mais sans toute cette syntaxe de pointeur. Vous pouvez maintenant transmettre l'objet réel (pas seulement sa valeur) ET vous disposez d'une manière plus lisible et normale d'interagir avec l'objet.
MyMethod(&type parameter)
{
parameter.DoThis()
parameter.DoThat()
}
Les références C ++ différaient des références C # / Java en ce qu'une fois que vous leur attribuiez une valeur qui l'était, vous ne pouviez pas la réattribuer (et elle doit être affectée lorsqu'elle a été déclarée). C'était la même chose que d'utiliser un pointeur const (un pointeur qui ne pouvait pas être redirigé vers un autre objet).
Java et C # sont des langages modernes de très haut niveau qui ont nettoyé une grande partie des dégâts qui s'étaient accumulés en C / C ++ au fil des ans et les pointeurs étaient certainement l'une de ces choses qui devaient être «nettoyées».
Dans la mesure où votre commentaire sur la connaissance des pointeurs fait de vous un programmeur plus fort, cela est vrai dans la plupart des cas. Si vous savez «comment» quelque chose fonctionne plutôt que de simplement l'utiliser sans le savoir, je dirais que cela peut souvent vous donner un avantage. La valeur d'un avantage variera toujours. Après tout, utiliser quelque chose sans savoir comment il est implémenté est l'une des nombreuses beautés de la POO et des interfaces.
Dans cet exemple spécifique, qu'est-ce que savoir sur les pointeurs vous aiderait avec des références? Comprendre qu'une référence C # n'est PAS l'objet lui-même mais pointe vers l'objet est un concept très important.
# 1: Vous ne
passez PAS par valeur Eh bien pour commencer, lorsque vous utilisez un pointeur, vous savez que le pointeur ne contient qu'une adresse, c'est tout. La variable elle-même est presque vide et c'est pourquoi il est si agréable de la passer en argument. En plus du gain de performances, vous travaillez avec l'objet réel de sorte que les modifications que vous apportez ne sont pas temporaires
# 2: Polymorphisme / Interfaces
Lorsque vous avez une référence qui est un type d'interface et qui pointe vers un objet, vous ne pouvez appeler que des méthodes de cette interface même si l'objet peut avoir beaucoup plus de capacités. Les objets peuvent également implémenter les mêmes méthodes différemment.
Si vous comprenez bien ces concepts, je ne pense pas que vous manquez trop de ne pas avoir utilisé de pointeurs. C ++ est souvent utilisé comme langage d'apprentissage de la programmation car il est parfois bon de se salir les mains. En outre, travailler avec des aspects de niveau inférieur vous permet d'apprécier le confort d'une langue moderne. J'ai commencé avec C ++ et je suis maintenant un programmeur C # et j'ai l'impression que travailler avec des pointeurs bruts m'a aidé à mieux comprendre ce qui se passe sous le capot.
Je ne pense pas qu'il soit nécessaire que tout le monde commence par des pointeurs, mais ce qui est important, c'est qu'ils comprennent pourquoi les références sont utilisées à la place des types valeur et la meilleure façon de comprendre cela est de regarder son ancêtre, le pointeur.