 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jarod Guest
|
Posted: Tue Jun 21, 2005 9:38 pm Post subject: référence ou pointeur ? |
|
|
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
|
Posted: Tue Jun 21, 2005 9:47 pm Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Wed Jun 22, 2005 4:14 am Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Wed Jun 22, 2005 6:34 am Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Wed Jun 22, 2005 8:14 am Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Wed Jun 22, 2005 2:45 pm Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Wed Jun 22, 2005 6:28 pm Post subject: Re: référence ou pointeur ? |
|
|
| 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
|
Posted: Wed Jun 22, 2005 8:15 pm Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Wed Jun 22, 2005 8:38 pm Post subject: Re: référence ou pointeur ? |
|
|
Merci beaucoup pour toutes vos réponses
J'y vois plus clair maintenant ;-)
|
|
| Back to top |
|
 |
Pierre Maurette Guest
|
Posted: Wed Jun 22, 2005 8:38 pm Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Thu Jun 23, 2005 5:53 am Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Thu Jun 23, 2005 7:35 am Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Thu Jun 23, 2005 7:44 am Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Thu Jun 23, 2005 7:44 am Post subject: Re: référence ou pointeur ? |
|
|
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
|
Posted: Thu Jun 23, 2005 9:39 am Post subject: Re: référence ou pointeur ? |
|
|
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 |
|
 |
|
|
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
|
|