Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

référence ou pointeur ?

24 réponses
Avatar
Jarod
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

10 réponses

1 2 3
Avatar
nico
Jarod wrote:

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

Avatar
Pierre Maurette
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é.

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

Avatar
Marc Boyer
Jarod 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 ?


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

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 ?

Avatar
kanze
Jarod wrote:

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

Avatar
Andre Heinen
On Tue, 21 Jun 2005 23:38:53 +0200, "Jarod"
wrote:

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/

Avatar
Florent Clairambault
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

Avatar
Pierre Lairez
Le Tue, 21 Jun 2005 23:38:53 +0200, Jarod 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.

Avatar
Jarod
Merci beaucoup pour toutes vos réponses
J'y vois plus clair maintenant ;-)
Avatar
Pierre Maurette
[...]
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

Avatar
Marc Boyer
Andre Heinen 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 ? 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;
}

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 ?

1 2 3