OVH Cloud OVH Cloud

difference entre reference et pointeur ?

35 réponses
Avatar
news.free.fr
bonjour , je cherche a savoir quel est la différence entre une passage par
référence et un passage par adresse.

Je sais ce qu'est un pointeur , mais c'est le pourquoi on a ajouté le
passage par référence au c++ alors qu'il existé deja la passage par adresse.

y a til des choses que le passage par référence peut faire que le passage
par adresse nepeut pas ?

merci a vous

Laurent

10 réponses

1 2 3 4
Avatar
Pierre Maurette
Marc Boyer a écrit:

In article , Pierre Maurette wrote:
Marc Boyer a écrit:
[...]
Les opérateurs surchargés. Et comme paramètre, et comme valeur de rétour
(de l'opérateur[], par exemple).
L'opérateur [], je ne vois pas trop une reference en paramètre.



Non, mais en valeur de retour.
Comment faire
std::vector<int> v;
...
v[0]= 1;
sans référence ?
OK, ça c'est clair depuis plusieurs messages.



OK, dès lors, on a introduit un nouveau (constructeur de) type
dans le système de types.
Alors, pourquoi l'interdire comme paramètre ? Comment batir
un système de type cohérent en rajoutant cette contrainte ?
Relire. Il n'est absolument pas question de contrainte à ce niveau-là,

mais de trouver un exemple répondant à:
"y a til des choses que le passage par référence peut faire que le
passage par adresse nepeut pas ? "


Il me semble que le retour d'une reference est utile et a du sens même
dans le cas d'une fonction globale. Ce qui me semble inutile, c'est le
passage d'une reference en paramètre d'une fonction globale.
(j'appelle fonction globale une fonction ne faisant pâs partie d'une
classe).


Ben, un retour devient parfois lui même un paramètre ;-)
Quand on reçoit une reference en retour, on peut passer directement sa

valeur ou son adresse:

int& ChoisirVariable(int* var1, int* var2, bool choix)
{
return(choix?*var1:*var2);
}
...
ChoisirVariable(&i, &ChoisirVariable(&j, &k, true), false) = 123;
// j = 123;


ostream& operator<<(ostream* os, int i);
ostream& operator<<(ostream* os, const char s[]);

&(&(&(cout<<"i= ")<<i)<<" j= ")<<j;
Relire également. Je parlais là de fonctions globales. Ceci dit, il

est clair que:
int& ChoisirVariable(int* var1, int* var2, bool choix);
n'est pas très heureux, au profit de:
int& ChoisirVariable(const int& var1, const int& var2, bool choix);
--
Pierre





Avatar
Marc Boyer
In article , Pierre Maurette wrote:
Marc Boyer a écrit:
[SNIP]

Relire. Il n'est absolument pas question de contrainte à ce niveau-là,
mais de trouver un exemple répondant à:
"y a til des choses que le passage par référence peut faire que le
passage par adresse nepeut pas ? "


Pardon, je pensais qu'on avait dépassé cette question là.
Car non, je ne vois rien qu'on ne puisse pas faire avec un
pointeur et qu'on puisse faire avec une référence (hormis
des questions de syntaxe).

dans le cas d'une fonction globale. Ce qui me semble inutile, c'est le
passage d'une reference en paramètre d'une fonction globale.
(j'appelle fonction globale une fonction ne faisant pâs partie d'une
classe).


Ben, un retour devient parfois lui même un paramètre ;-)
Quand on reçoit une reference en retour, on peut passer directement sa

valeur ou son adresse:

int& ChoisirVariable(int* var1, int* var2, bool choix)
{
return(choix?*var1:*var2);
}
...
ChoisirVariable(&i, &ChoisirVariable(&j, &k, true), false) = 123;
// j = 123;


ostream& operator<<(ostream* os, int i);
ostream& operator<<(ostream* os, const char s[]);

&(&(&(cout<<"i= ")<<i)<<" j= ")<<j;
Relire également. Je parlais là de fonctions globales. Ceci dit, il

est clair que:


Ben, mon operateur << n'est pas une fonction membre.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.





Avatar
Andre Heinen
On Tue, 23 Nov 2004 10:43:55 +0100, Pierre Maurette
wrote:

Ce qui me semble inutile, c'est le
passage d'une reference en paramètre d'une fonction globale.


Pourquoi? Les avantages ne sont-ils pas les mêmes que dans le
cas d'une fonction membre?

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz

Avatar
Pierre Maurette
Andre Heinen a écrit:

On Tue, 23 Nov 2004 10:43:55 +0100, Pierre Maurette
wrote:

Ce qui me semble inutile, c'est le
passage d'une reference en paramètre d'une fonction globale.


Pourquoi? Les avantages ne sont-ils pas les mêmes que dans le
cas d'une fonction membre?
Vous avez sans doute raison. Je suis sans doute influencé par le C, et

la crainte d'erreurs, alors que l'utilisation de reference n'est
jamais obligatoire, et celle de pointeurs supposée maîtrisée.
Mais je ne sais pas s'il est de bonne règle de style de modifier un
paramètre formel.
--
Pierre


Avatar
Andre Heinen
J'en avais oublié une qui est peut-être la plus importante: les
références sont indispensables pour les constructeurs par copie.

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz
Avatar
Andre Heinen
On Tue, 23 Nov 2004 13:46:48 +0100, Pierre Maurette
wrote:

alors que l'utilisation de reference n'est
jamais obligatoire,


Sauf, comme je viens de m'en souvenir en vous lisant, dans le cas
des constructeurs par copie. ;-)

Mais je ne sais pas s'il est de bonne règle de style de modifier un
paramètre formel.


Je ne sais pas non plus. AMHA les deux points de vue se
défendent, aussi bien en ce qui concerne les fonctions membres
que les fonctions non membres.

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz

Avatar
Gabriel Dos Reis
Pierre Maurette writes:

| a écrit:
|
| >Pierre Maurette wrote in message
| >news:...
| >
| >> Je ne vois pas d'exemple de passage par reference qui ne pourrait pas
| >> être résolus de façon traditionnelle par un pointeur (mais ça doit
| >> bien exister).
| >
| >Les opérateurs surchargés. Et comme paramètre, et comme valeur de rétour
| >(de l'opérateur[], par exemple).
| L'opérateur [], je ne vois pas trop une reference en paramètre. En
| revanche << et >> seraient peut-être un meilleur exemple ?

Porbablement. James a raison : les références ont été introduite en
C++ afin d'efficacement supporter la surcharge d'opérateur. Voir son
exemple de « + » sur les matrices.

| Il me semble que le retour d'une reference est utile et a du sens même
| dans le cas d'une fonction globale. Ce qui me semble inutile, c'est le
| passage d'une reference en paramètre d'une fonction globale.

Pour quelles raisons ? Quelle est la différence entre foo() et
operator+() ?

-- Gaby
Avatar
Loïc Joly
Gabriel Dos Reis wrote:

[...]
James a raison
[...]


Ce jour est à marquer d'une croix dans le calendrier ;)

--
Loïc

Avatar
Gabriel Dos Reis
Loïc Joly writes:

| Gabriel Dos Reis wrote:
|
| [...]
| > James a raison
| [...]
|
| Ce jour est à marquer d'une croix dans le calendrier ;)

?

-- Gaby
Avatar
Alain Naigeon
"Loïc Joly" a écrit dans le message news:
41a3986a$0$17392$
Gabriel Dos Reis wrote:

[...]
James a raison
[...]


Ce jour est à marquer d'une croix dans le calendrier ;)


ambigu : la croix, c'est pour "... a..." ou pour "... wrote" ? ;-)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


1 2 3 4