2010-06-24 5 views

Répondre

6

Parce que C a été inventé en premier. Je ne sais pas s'ils n'avaient pas pensé à des références à l'époque (étant pour la plupart inutiles), ou s'il y avait une raison particulière de ne pas les inclure (peut-être la complexité du compilateur). Ils sont certainement beaucoup plus utiles pour les constructions orientées objet et génériques que le style procédural de C.

1

Ils ne sont pas présents dans C parce qu'ils ne sont pas nécessaires. C a très peu de fonctionnalités «étrangères». Vous pouvez écrire n'importe quel programme sans utiliser de références, elles ne sont donc pas incluses. Je suppose que C a été développé beaucoup plus tard que C, donc ses concepteurs ont jeté toutes sortes de choses qui n'étaient pas initialement présentes dans C.

0

Je suppose que C est né avec un chapeau minimaliste, et les références ne sont que du sucre syntaxique pour les pointeurs.

+1

C'est une vue très simpliste des références et bien que techniquement (à un très bas niveau) vrai pas vraiment une description précise de ce que sont les références. –

5

Les arguments de référence ont été inventés à l'origine, AFAIK, pour une chose: sémantique de surcharge de l'opérateur. Par exemple, l'opérateur [] doit juste renvoyer une référence.

Il était alors un sujet de grand débat si le «pointeur caché» devrait être utilisé pour n'importe quoi d'autre jamais.

De nombreux documents de convention de développement de nombreuses entreprises ont déclaré «n'utilisez jamais de références, si vous avez besoin d'un pointeur, dites-le».

Cependant, il a alors été découvert que les références ont un avantage majeur (non, pas la syntaxe du sucre). C'est ceci: une référence est garantie pour être valide, sauf si vous travaillez vraiment dur pour la casser.

Personnellement, je ne comprends toujours pas pourquoi je ne peux pas le faire en C++:

int a1, a2; 
int &b = a1; 
&b = a2; // Error. address of referenced is not an lvalue. Why?! 
+0

Ce code n'a aucun sens. La deuxième ligne essaie d'initialiser un entier à partir d'un pointeur; le troisième essaie d'affecter un entier à un pointeur temporaire. Les deux donnent une incompatibilité de type. L'erreur vous indique que vous ne pouvez pas affecter à un temporaire; même si vous le pouviez, cela n'aurait aucun effet puisque le temporaire est immédiatement détruit. Qu'est-ce que tu veux faire? –

+0

La troisième ligne essaie d'assigner l'adresse de 'b', ce qui est (dans un sens) la même chose que d'essayer de déplacer la variable' b' vers l'adresse spécifiée. Je ne peux pas penser à un cas où vous voudriez faire ceci. Si vous avez besoin d'une variable associée à un emplacement mémoire particulier, utilisez un «void *» pour pointer vers une adresse mémoire.Autoriser quelque chose comme ceci signifierait aussi que '& b = & a2' serait autorisé, ce qui donnerait les deux variables (uniques)' b' et 'a2' à la même adresse, ce qui n'a aucun sens. Arbitrairement "déplacer" une variable comme ça va gâcher les offsets de mémoire générés par le compilateur. – bta

+0

désolé moi idiot. code fixe. s'il vous plaît ne tenez pas compte de ce que vous pensez que je voulais dire. –

1

Comme vous le savez, C++ par C antidate environ une décennie. Les références étaient une fonctionnalité introduite dans le langage C++. Certaines fonctionnalités du langage C++ ont été adoptées par les versions ultérieures de la norme C (telles que const et // comment). Le concept de références n'a pas été aussi loin.

On peut supposer que leur utilité dans la programmation orientée objet ne se traduit pas aussi utile à la programmation procédurale de C.

1

Je pense que je suis d'accord avec l'idée de Pavel qu'ils ont été inventés pour faire des opérateurs surchargées fonctionnent correctement. Il est assez clair que les premières versions de C++ (C avec classes) n'avaient pas de références comme si elles le faisaient, this serait une référence au lieu d'un pointeur.