OVH Cloud OVH Cloud

operator [] const et non const

4 réponses
Avatar
Laurent DELEPINE
Bonjour,

J'ai crée une classe chargée de maintenir une chaine de caractere
dynamique. J'y a ajoutés deux operateur []. La classe se présente ainsi :

class String
{
...
public:
char operator[] (size_t) const;
char & operator[] (size_t);
...
};

La classe semble marcher correctement, sauf que a l'usage, la version
const de l'operateur n'est jamais appelé.

Par exemple :
String MaChaine ("...");

MaChaine[x] = 'X'; <-- la c'est l'operateur non const qui est appelé
(normal).

char c = MaChaine[x]; <-- la aussi c'est l'operateur non const. Pourtant
je m'attendait a ce que ce soit la version const dans ce cas, puisque
la chaine n'est pas modifiée.

Bien que point de vue de l'utilisateur tout semble normal, en interne
les deux operateur ne font pas du tout la meme chose. Notament, les
chaines peuvent etre partagée entre plusieurs instance et la version non
const duplique les chaines si necessaire avant d'effectuer l'operation,
pas la version const. Le principal interet de la classe disparait donc.

Comment corriger cela pour que la version const soit utilisé quand c'est
possible ?


A+

LD

4 réponses

Avatar
Vincent Richard

J'ai crée une classe chargée de maintenir une chaine de caractere
dynamique. J'y a ajoutés deux operateur []. La classe se présente ainsi :


Pourquoi ne pas utiliser "std::string" ?

class String
{
...
public:
char operator[] (size_t) const;
char & operator[] (size_t);
...
};

[...]

MaChaine[x] = 'X'; <-- la c'est l'operateur non const qui est appelé
(normal).

char c = MaChaine[x]; <-- la aussi c'est l'operateur non const. Pourtant
je m'attendait a ce que ce soit la version const dans ce cas, puisque
la chaine n'est pas modifiée.


Il faut peut-être déclarer la version 'const' comme ceci :

const char operator[] (size_t) const;

(fonction constante, valeur de retour constante).

Bon, je n'ai pas essayé, je ne sais pas si ça fonctionnera...

Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-

Avatar
Stéphane Poulet
Si je ne me trompe pas, ton opérateur const ne sera appelé que si c'est
appliqué à un objet de type const.
Ex :
const String s;
...
s[15] = 'x'; // ce sera l'operateur const qui sera appelé


Laurent DELEPINE wrote:

Bonjour,

J'ai crée une classe chargée de maintenir une chaine de caractere
dynamique. J'y a ajoutés deux operateur []. La classe se présente ainsi :

class String
{
...
public:
char operator[] (size_t) const;
char & operator[] (size_t);
...
};

La classe semble marcher correctement, sauf que a l'usage, la version
const de l'operateur n'est jamais appelé.

Par exemple :
String MaChaine ("...");

MaChaine[x] = 'X'; <-- la c'est l'operateur non const qui est appelé
(normal).

char c = MaChaine[x]; <-- la aussi c'est l'operateur non const. Pourtant
je m'attendait a ce que ce soit la version const dans ce cas, puisque
la chaine n'est pas modifiée.

Bien que point de vue de l'utilisateur tout semble normal, en interne
les deux operateur ne font pas du tout la meme chose. Notament, les
chaines peuvent etre partagée entre plusieurs instance et la version non
const duplique les chaines si necessaire avant d'effectuer l'operation,
pas la version const. Le principal interet de la classe disparait donc.

Comment corriger cela pour que la version const soit utilisé quand c'est
possible ?


A+

LD




Avatar
Laurent DELEPINE
Stéphane Poulet wrote:
Si je ne me trompe pas, ton opérateur const ne sera appelé que si c'est
appliqué à un objet de type const.
Ex :
const String s;
...
s[15] = 'x'; // ce sera l'operateur const qui sera appelé


Je ne crois pas. Ici l'objet est modifié, ce qui est contraire a la
declaration const de l'operateur.

A+

LD

Avatar
kanze
Laurent DELEPINE wrote in message
news:<3f565f50$0$26405$...
Stéphane Poulet wrote:
Si je ne me trompe pas, ton opérateur const ne sera appelé que si
c'est appliqué à un objet de type const.

Ex :
const String s;
...
s[15] = 'x'; // ce sera l'operateur const qui sera appelé


Je ne crois pas. Ici l'objet est modifié, ce qui est contraire a la
declaration const de l'operateur.


Ça dépend. L'objet en question est const. C'est donc bien l'opérateur
const qui serait appelé. Indépendamment de ce qu'il fait ailleurs dans
l'expression. Maintenant, dans son cas, le type de retour de l'opérateur
[] const n'était pas légal au côté gauche d'une affectation, ce qui
provoquera une erreur de compilation. Mais l'erreur n'est pas parce
qu'il a voulu appelé l'opérateur const en soi ; c'est bien au cause de
son type de retour.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16