web-dev-qa-db-fra.com

C ++ - surcharge opérateur []

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.

13
Mojo28

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.

15
TartanLlama

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[].

12
Bathsheba