J'ai un tableau de classe de modèle:
template <class T=int, int SIZE=10>
class Array {
T TheArray[SIZE];
public:
void Initialize() {
for (int idx=0; idx < SIZE; idx++) {
TheArray[idx] = T();
}
}
T& operator [](int idx) {
return TheArray[idx];
}
T operator [](int idx) const {
return TheArray[idx];
}
}
J'ai des questions sur la surcharge de l'opérateur []
(J'ai trouvé cet exemple sur le net).
Je comprends que T& operator [](int idx)
renvoie une référence à la valeur du tableau avec l'index idx
et que T operator [](int idx) const
renvoie sa valeur. Cependant, je ne sais pas dans quel cas la référence ou la valeur sera retournée en utilisant l'opérateur []
.
De plus, si je change T operator [](int idx) const
-> T operator [](int idx)
, le compilateur se plaint. Pourquoi donc? Je peux comprendre que le compilateur se plaint parce que seul le type de retour est différent, mais pourquoi ne se plaint-il pas lorsque const
est ajouté? Cela signifie seulement que les internes de la classe ne sont pas modifiés, non?
J'ai essayé de déboguer cette petite implémentation principale:
int main() {
int val;
Array<> intArray;
intArray.Initialize();
val = intArray[1];
printf("%d", intArray[1]);
intArray[1] = 5;
}
Et chaque fois que T& operator [](int idx)
est appelée. Pourquoi?
Merci d'avance.
Le operator[]
la surcharge sera sélectionnée en fonction de la qualification const
- de l'objet sur lequel vous l'appelez.
Array<> intArray;
intArray[1]; //calls T& operator[]
const Array<> constArray;
constArray[1]; //calls T operator[]
Si vous supprimez le const
de T operator[]
, vous obtenez une erreur car les fonctions membres ne peuvent pas avoir la même qualification et paramètres const
- car il n'y aurait aucun moyen de sélectionner entre elles.
Tout d'abord, considérez []
Comme du sucre syntaxique pour appeler this->operator[]
.
La version const
sera appelée si this
est un pointeur const
, sinon la version non -const
sera appelée.
Pour continuer, vous devez utiliser const T& operator [](int idx) const {
, c'est-à-dire que la version const
renvoie une référence const
. Cela permettra d'économiser les frais généraux liés à la prise d'une copie complète.
Enfin, le const
- ness d'une fonction est partie de sa signature. Cela vous permet de surcharger en fonction de const
- ness. Sinon, vous ne pourriez pas avoir les deux versions de operator[]
.