wake-up-neo.com

C ++ - Überladen des Operators []

Ich habe eine Template-Klasse Array:

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];
    }
}

Ich habe einige Fragen zum Überladen des Operators [] (Ich habe dieses Beispiel im Netz gefunden).

Ich verstehe, dass T& operator [](int idx) einen Verweis auf einen Array-Wert mit dem Index idx zurückgibt und dass T operator [](int idx) const seinen Wert zurückgibt. Ich bin mir jedoch nicht sicher, in welchem ​​Fall Referenz oder Wert mit dem Operator [] Zurückgegeben werden.

Auch wenn ich T operator [](int idx) const -> T operator [](int idx) ändere, beschwert sich der Compiler. Warum das? Ich kann verstehen, dass der Compiler sich beschwert, weil nur der Rückgabetyp unterschiedlich ist, aber warum beschwert er sich nicht, wenn const hinzugefügt wird? Dies bedeutet nur, dass nicht die Interna der Klasse geändert werden, oder?

Ich habe versucht, diese kleine Hauptimplementierung zu debuggen:

int main() {
    int val;
    Array<> intArray;

    intArray.Initialize();
    val = intArray[1];
    printf("%d", intArray[1]);
    intArray[1] = 5;
}

Und jedes Mal, wenn T& operator [](int idx) aufgerufen wird. Warum?

Danke im Voraus.

13
Mojo28

Die operator[] - Überladung wird basierend auf der const -Qualifikation des Objekts ausgewählt, auf das Sie sie aufrufen.

Array<> intArray;
intArray[1]; //calls T& operator[]

const Array<> constArray;
constArray[1]; //calls T operator[]

Wenn Sie const aus T operator[] Entfernen, wird eine Fehlermeldung angezeigt, da die Mitgliedsfunktionen nicht dieselbe const -Qualifikation und dieselben Parameter haben können, da es keine Möglichkeit gibt, zwischen ihnen zu wählen .

15
TartanLlama

Betrachten Sie [] Als erstes als syntaktischen Zucker für den Aufruf von this->operator[].

Die const Version wird aufgerufen, wenn this ein const Zeiger ist, andernfalls wird die nicht-const Version aufgerufen.

Wenn Sie fortfahren, sollten Sie const T& operator [](int idx) const { verwenden, d. H. Die const -Version muss eine const -Referenz zurückgeben. Dies erspart den Aufwand für das Erstellen einer umfangreichen Kopie.

Schließlich ist die const- ness einer Funktion ist Teil ihrer Signatur. Auf diese Weise können Sie basierend auf const- eine Überladung durchführen. Andernfalls könnten Sie die beiden Versionen von operator[] Nicht haben.

12
Bathsheba