Salut,
Pour commencer, je voudrais revenir sur ce qui a été dit :
Je suis tout à fait d'accord qu'au niveau du code binaire généré, pointeurs et référence sont du pareil au même, mais, au niveau du code C++ (et c'est ce qui nous intéresse ici :D ), ce sont deux choses radicalement différentes! :
D'abord parce que les pointeurs et les références présentent des possibilités différentes (le fait qu'un pointeur puisse etre nul et qu'une référence apporte une garantie de non nullité étant l'une des différences principales)
Ensuite, parce qu'un pointeur est une variable de type numérique qui représtente l'adresse à laquelle on va trouver une variable d'un type donné, alors qu'une référence est un alias de la variable.
Rajoutez à cela la capacité des références à suivre et à respecter la constance : une référence constante certifie que l'objet passé en référence ne sera pas modifié, alors qu'un pointeur constant ne garanti que le fait que l'on n'essayera pas de modifier l'adresse pointée (il faut passer un pointeur sur un objet constant ou un pointeur constant sur un objet constant pour garantir que l'ojbet ne sera pas modifié :P)
Il faut aussi compter sur le fait que les références permettent de créer des variables temporaires non nommées, et c'est la raison pour laquelle on ne peut fournir une valeur par défaut que dans le cas de référence constante (on créera une variable qui n'existera que pour la durée de l'exécution de la fonction appelée, il n'y a donc absolument pas lieu d'en permettre la modification ;))
Enfin, parce qu'Ils s'utilisent de manière radicalement différente, et pas seulement du point de vue de la syntaxe :
Imaginez une chaine C style comme exemple d'utilisation d'un pointeur. Si vous voulez réallouer un espace mémoire supplémentaire, vous devrez passer par ... un pointeur de pointeur, et vous devrez donc penser à accéder à ce qui est pointé par ce pointeur de pointeur.
De là à se retrouver à travailler avec des pointeurs de pointeurs de pointeurs (de pointeurs, de... ), il n'y a qu'un pas, et la complexité de travail suivra la même évolution :P
Tu aurais très bien pu faire quelque chose comme
etCode:
1
2
3
4
5
6
7
8
9 void foo(std::vector<type> & tab) { /* remplissage du tableau */ } void foo(std::vector<type> & first, std::vector<type>& second) { foo(first); foo(second); }
- tu te serais évité l'utilisation d'un pointeur
- tu te serais évité des tests de non nullité sur le second argument
- ton code aurait été parfaitement factorisé