C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

référence ou pointeur ?
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Jarod
Guest





PostPosted: Tue Jun 21, 2005 9:38 pm    Post subject: référence ou pointeur ? Reply with quote



Selon vous, dans quel(s) cas est il préférable d'utiliser un pointeur et
dans quel(s) cas vaut-il mieux utiliser une référence ?
(en supposant qu'on ne veux pas faire de passage par valeur pour éviter la
copie de l'objet)
En fait, je pose cette question pour le passage d'un argument et pour la
variable d'une classe (il y a donc 2 questions).
Merci


Back to top
nico
Guest





PostPosted: Tue Jun 21, 2005 9:47 pm    Post subject: Re: référence ou pointeur ? Reply with quote



Jarod wrote:

Quote:
Selon vous, dans quel(s) cas est il préférable d'utiliser un pointeur et
dans quel(s) cas vaut-il mieux utiliser une référence ?
(en supposant qu'on ne veux pas faire de passage par valeur pour éviter la
copie de l'objet)
En fait, je pose cette question pour le passage d'un argument et pour la
variable d'une classe (il y a donc 2 questions).
Merci

Pour une fonction mieux vaut une reference, genre :

void maFonction(const Classe1& obj1, Classe2& obj2)
{
cout << obj1.fn();
obj2.setName("salut");
}

--
nico

Back to top
Pierre Maurette
Guest





PostPosted: Wed Jun 22, 2005 4:14 am    Post subject: Re: référence ou pointeur ? Reply with quote



Jarod, le 21/06/2005, a écrit :
Quote:
Selon vous, dans quel(s) cas est il préférable d'utiliser un pointeur et dans
quel(s) cas vaut-il mieux utiliser une référence ?
(en supposant qu'on ne veux pas faire de passage par valeur pour éviter la
copie de l'objet)
C'est une question de FAQ. Voici ce que le débutant (ou plutôt

utilisateur superficle) que je suis en retient:
- Par une référence, le programmeur indique au compilateur ce qu'il
veut faire (avoir accès à un objet dans une fonction). Le compilateur
se démerdera pour mettre en oeuvre les moyens adéquats, éventuellement
il passera l'adresse de l'objet, le programmeur s'en fiche. S'il passe
l'adresse de l'objet, ce sera équivalent à un passage de pointeur
type*const ptr, c'est à dire que la valeur de ce pointeur ne pourra
être modifiée. Par un passage de pointeur par copie de sa valeur, le
programmeur choisit les moyens.
Passer une référence sur un objet (au sens large) consiste donc à
donner accès à cet objet. On communique "le plan d'accès et les clés".
Les références n'ont un sens que dans le passage d'arguments (il y a
des exceptions). Je les vois un peu comme une entourloupe pour
introduire tardivement la notion de passage par variable (vs par
valeur) tout en préservant ce qui est hérité du C, le passage exclusif
par copie de valeur.
- En C++, par défaut, on passera par référence. Une référence sur un
objet est initialisée à la déclaration et ne pourra plus être modifiée
par la suite. Un pointeur peut ne pointer sur rien (NULL), et sa
valeur, c'eat à dire l'objet pointé, peut changer. C'est si un de ces
points est utile que le passage par pointeur pourra être préféré.

Quote:
En fait, je pose cette question pour le passage d'un argument et pour la
variable d'une classe (il y a donc 2 questions).
Je n'ai jamais utilisé de donnée membre de type référence (je ne m'en

vante pas, c'est comme ça). Les données membres classiques de types
pointeur ne sont me semble-t-il pas transformables en références. Les
contraintes sur une donnée membre référence sont telles que les cas
d'utilisations sont certainement très spécifiques: la référence doit
être initialisée explicitement dans le constructeur, et ne pourraêtre
modifiée (l'affectation, pas l'objet référencé, bien sûr). L'objet
référencé doit donc exister avant la classe et ne pourra être détruit
qu'après la destruction de la classe.

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette


Back to top
Marc Boyer
Guest





PostPosted: Wed Jun 22, 2005 6:34 am    Post subject: Re: référence ou pointeur ? Reply with quote

Jarod <julien.fond (AT) neuf (DOT) fr> a écrit :
Quote:
Selon vous, dans quel(s) cas est il préférable d'utiliser un pointeur et
dans quel(s) cas vaut-il mieux utiliser une référence ?

N'utiliser un pointeur que quand le passage par référence est
impossible ?

Quote:
En fait, je pose cette question pour le passage d'un argument et pour la
variable d'une classe (il y a donc 2 questions).

Ma réponse s'applique aux deux ;-)

Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Wed Jun 22, 2005 8:14 am    Post subject: Re: référence ou pointeur ? Reply with quote

Jarod wrote:

Quote:
Selon vous, dans quel(s) cas est il préférable d'utiliser un
pointeur et dans quel(s) cas vaut-il mieux utiliser une
référence ? (en supposant qu'on ne veux pas faire de passage
par valeur pour éviter la copie de l'objet)

En fait, je pose cette question pour le passage d'un argument
et pour la variable d'une classe (il y a donc 2 questions).

En fait, la réponse serait toujours : lequels des deux sera plus
lisible pour celui qui suit ? Et la réponse à cette question
dépend au moins en partie sur les conventions en cours où on
travaille -- parfois, la règle est d'utiliser toujours une
référence, chaque fois que c'est possible ; parfois, on retient
des pointeurs aussi pour des choses « pointeuresques » -- plus
d'une règle de codage que j'ai vu préconsise les pointeurs
chaque fois qu'il y a transfert de propriété, par exemple, et
d'autres utilise un pointeur pour dire que la fonction appelé en
garde une copie, qui pourrait servir plus tard (et que donc, il
ne faut pas lui passer un temporaire).

Au delà de ça, certaines règles s'imposent :

-- Si la présence de l'objet est optionnelle, un pointeur
permet de signaler son absence (par un pointeur nul).

-- Si une classe doit supporter l'affectation, les références
en rend l'implémentation beaucoup plus difficile (voire
impossible).

-- Si on a un pointeur comme paramètre, il faut toujours
définir le comportement dans le cas où le pointeur serait
nul, et ensuite faire le test et implémenter ce
comportement.

Pour la reste, définir des règles, et y adhérer rigueureusement.
Le fait d'y adhérer est plus important que les règles
elles-mêmes. (Et évidemment, si tu te trouves dans une contexte
où il y a déjà des règles, n'en crée pas de nouveau toi-même.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
Andre Heinen
Guest





PostPosted: Wed Jun 22, 2005 2:45 pm    Post subject: Re: référence ou pointeur ? Reply with quote

On Tue, 21 Jun 2005 23:38:53 +0200, "Jarod" <julien.fond (AT) neuf (DOT) fr>
wrote:

Quote:
Selon vous, dans quel(s) cas est il préférable d'utiliser un pointeur et
dans quel(s) cas vaut-il mieux utiliser une référence ?


- Plutôt les références dans ces cas-ci:

Les références sont indispensables pour les constructeurs par copie.

Les pointeurs ne conviennent pas pour la surcharge des opérateurs. Il
vaut mieux utiliser des références dans ce cas.


- Plutôt les pointeurs dans ces cas-là:

On ne peut pas utiliser de références dans les conteneurs de la
bibliothèque standard. Dans ce cas, il faut utiliser des pointeurs.
Par exemple, il faut utiliser vector<X*> au lieu de vector<X&>.

Une référence, une fois initialisée, ne peut plus être modifiée pour
"pointer" sur un autre objet. On ne peut pas utiliser de référence si
on a besoin de changer l'objet pointé. Les deux exemples qui me
viennent à l'esprit sont l'arithmétique de pointeurs et les membres de
classes qui doivent supporter l'affectation.

Une référence ne peut pas être nulle. On ne peut pas utiliser de
référence si on a besoin de la valeur nulle.


- L'un ou l'autre, selon les goûts:

Si une fonction modifie son argument, certains programmeurs trouvent
qu'il vaut mieux utiliser un pointeur parce que ça rend plus explicite
(dans le code client, l'appel de fonction) le fait que la fonction
peut modifier l'argument, par exemple f(&i).
D'autres programmeurs utilisent des références mais choisissent un nom
de fonction explicite, par exemple modifier(i).


Voir aussi la FAQ de Stroustrup:
http://www.research.att.com/~bs/bs_faq2.html#pointers-and-references

--
André Heinen
Mon e-mail, encodé ROT13: n qbg urvara ng rhebcrnayvax qbg pbz
La FAQ: http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/

Back to top
Florent Clairambault
Guest





PostPosted: Wed Jun 22, 2005 6:28 pm    Post subject: Re: référence ou pointeur ? Reply with quote


Quote:
N'utiliser un pointeur que quand le passage par référence est
impossible ?

J'aime bien cette réponse, on pourrait même dire : impossible ou inadapté.

Florent

Back to top
Pierre Lairez
Guest





PostPosted: Wed Jun 22, 2005 8:15 pm    Post subject: Re: référence ou pointeur ? Reply with quote

Le Tue, 21 Jun 2005 23:38:53 +0200, Jarod <julien.fond (AT) neuf (DOT) fr> a écrit:

Quote:
Selon vous, dans quel(s) cas est il préférable d'utiliser un pointeur et
dans quel(s) cas vaut-il mieux utiliser une référence ?


A chaque fois que tu te le demande, utilise des références: c'est plus sûr
(les références invalides n'existent pas) et plus pratique (parce que plus
sûr, c'est autant de vérification en moins) que des pointeurs.
Donc n'utilise les pointeurs que quand tu ne peux raisonnablement pas
utiliser les références (quand tu a beoins de réaffecter par ex.).

Je pense que cette tègle ne souffre pas d'exceptions.

Back to top
Jarod
Guest





PostPosted: Wed Jun 22, 2005 8:38 pm    Post subject: Re: référence ou pointeur ? Reply with quote

Merci beaucoup pour toutes vos réponses
J'y vois plus clair maintenant ;-)


Back to top
Pierre Maurette
Guest





PostPosted: Wed Jun 22, 2005 8:38 pm    Post subject: Re: référence ou pointeur ? Reply with quote

Pierre Lairez, le 22/06/2005, a écrit :
[...]
Quote:
Je pense que cette tègle ne souffre pas d'exceptions.
La règle voulant qu'une règle ne souffre pas d'exception est une bonne

règle. Malheureusement, elle souffre généralement d'exceptions ;-)

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette


Back to top
Marc Boyer
Guest





PostPosted: Thu Jun 23, 2005 5:53 am    Post subject: Re: référence ou pointeur ? Reply with quote

Andre Heinen <nospam (AT) nospam (DOT) invalid> a écrit :
Quote:
Si une fonction modifie son argument, certains programmeurs trouvent
qu'il vaut mieux utiliser un pointeur parce que ça rend plus explicite
(dans le code client, l'appel de fonction) le fait que la fonction
peut modifier l'argument, par exemple f(&i).

Heuh, des anciens programmeurs C alors ? Parce que des fonctions
qui peuvent modifier leur argument 'sémantique' sans passer par un
pointeur, c'est facile, surtout quand on code "à la C".

struct Stack {
size_t size;
int values*;
};

void RAZ(Stack s){
for(size_t i=0;i<size;++i)
values[i]= 0;
}

Quote:
D'autres programmeurs utilisent des références mais choisissent un nom
de fonction explicite, par exemple modifier(i).

Et puis en C++, on a "const" surtout.

AMHA, en C++, il vaut mieux éviter de penser pointeur <=> modif param,
car on va assez vite se faire avoir.

Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?

Back to top
Andre Heinen
Guest





PostPosted: Thu Jun 23, 2005 7:35 am    Post subject: Re: référence ou pointeur ? Reply with quote

On Thu, 23 Jun 2005 05:53:51 +0000 (UTC), Marc Boyer
<Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> wrote:

Quote:
Andre Heinen <nospam (AT) nospam (DOT) invalid> a écrit :
Si une fonction modifie son argument, certains programmeurs trouvent
qu'il vaut mieux utiliser un pointeur parce que ça rend plus explicite
(dans le code client, l'appel de fonction) le fait que la fonction
peut modifier l'argument, par exemple f(&i).

Heuh, des anciens programmeurs C alors ?

Sans doute... ;-)

Quote:
D'autres programmeurs utilisent des références mais choisissent un nom
de fonction explicite, par exemple modifier(i).

Et puis en C++, on a "const" surtout.

En C aussi, maintenant. Mais const n'est visible que dans la
déclaration (et la définition) de la fonction, pas dans le code client
(l'appel de fonction).

Quote:
AMHA, en C++, il vaut mieux éviter de penser pointeur <=> modif param,
car on va assez vite se faire avoir.

Personnellement, c'est aussi mon avis.

--
André Heinen
Mon e-mail, encodé ROT13: n qbg urvara ng rhebcrnayvax qbg pbz
La FAQ: http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/

Back to top
Andre Heinen
Guest





PostPosted: Thu Jun 23, 2005 7:44 am    Post subject: Re: référence ou pointeur ? Reply with quote

On Wed, 22 Jun 2005 16:45:07 +0200, Andre Heinen
<nospam (AT) nospam (DOT) invalid> wrote:

Quote:
Une référence, une fois initialisée, ne peut plus être modifiée pour
"pointer" sur un autre objet. On ne peut pas utiliser de référence si
on a besoin de changer l'objet pointé.

Lisez plutôt "changer d'objet pointé".

--
André Heinen
Mon e-mail, encodé ROT13: n qbg urvara ng rhebcrnayvax qbg pbz
La FAQ: http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/

Back to top
Andre Heinen
Guest





PostPosted: Thu Jun 23, 2005 7:44 am    Post subject: Re: référence ou pointeur ? Reply with quote

On Wed, 22 Jun 2005 22:15:30 +0200, "Pierre Lairez"
<pierre.lairez (AT) wanadoo (DOT) fr> wrote:

Quote:
A chaque fois que tu te le demande, utilise des références

Je ne dirais pas ça. Par exemple, je me souviens d'un temps où je me
demandais si, dans les conteneurs de la bibliothèque standard, il
valait mieux utiliser des références ou des pointeurs. Si j'avais
suivi ton raisonnement, j'aurais utilisé des références, et ça
n'aurait pas marché.

Quote:
c'est plus sûr
(les références invalides n'existent pas)

J'ai dit ça aussi, une fois, mais Gaby m'a vite corrigé. Je te
recopie son exemple:

int& f() { int i = 0; return i; }
int main() { int& r = f(); return r; }

--
André Heinen
Mon e-mail, encodé ROT13: n qbg urvara ng rhebcrnayvax qbg pbz
La FAQ: http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Jun 23, 2005 9:39 am    Post subject: Re: référence ou pointeur ? Reply with quote

Pierre Lairez wrote:
Quote:
Le Tue, 21 Jun 2005 23:38:53 +0200, Jarod <julien.fond (AT) neuf (DOT) fr> a écrit:

Selon vous, dans quel(s) cas est il préférable d'utiliser un
pointeur et dans quel(s) cas vaut-il mieux utiliser une
référence ?

A chaque fois que tu te le demande, utilise des références:
c'est plus sûr (les références invalides n'existent pas) et
plus pratique (parce que plus sûr, c'est autant de
vérification en moins) que des pointeurs. Donc n'utilise les
pointeurs que quand tu ne peux raisonnablement pas utiliser
les références (quand tu a beoins de réaffecter par ex.).

Je pense que cette tègle ne souffre pas d'exceptions.

void
destroy( MaClasse& c )
{
if ( ! c.canDestroy() ) {
throw CannotDestroyError ;
}
delete &c ;
}

Je connais pas mal de programmeurs qui rechigneraient à la ligne
« delete &c ». Et qui préfèreraient passer un pointeur dans ce
cas-ci.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.