c ++ zwei Versionen des überladenen Subscript-Operators

8

Meine Frage betrifft den Unterschied zwischen:

%Vor%

und:

%Vor%

Warum sollte ich beide in einer Klasse definiert haben? Was ist der Zweck? Wäre das nicht ausreichend?

    
Simon Righley 14.03.2013, 15:45
quelle

4 Antworten

15

Eine Memberfunktionsdeklaration mit const am Ende erlaubt es, diese Funktion auch für ein const -Objekt aufzurufen. Dies ist nur sinnvoll für Elementfunktionen, die den Status des Objekts nicht ändern.

Nehmen wir an, die Klasse, die diese Operatoren überlädt, heißt X . Vermutlich verhält es sich ein wenig wie ein Container, der über dieses operator[] Zugriff auf die enthaltenen Elemente gibt.

Nehmen wir nun an, der Benutzer möchte const X verwenden:

%Vor%

Sollte der Benutzer das tun dürfen? Wahrscheinlich. Wenn sie einen Container haben wollen, der unveränderlich ist, dann lass sie ihn haben. Wenn Sie die const -Version von operator[] nicht zur Verfügung gestellt hätten, wären sie dazu nicht in der Lage. Sie versuchen nicht, den Container zu ändern, sie sehen nur seinen Inhalt.

Nun, warum macht die const Version von operator[] eine const Referenz? Weil es muss. Es gibt einen Verweis auf ein Mitglied der Klasse selbst zurück. Wenn der Container const ist und einen Verweis auf nicht const zurückgibt, kann der Aufrufer seine Interna nur mit diesem Operator ändern:

%Vor%

Oh, wir ändern den Status von x , obwohl es const ist. Das wäre schlecht und der Compiler lässt es sogar nicht zu.

    
Joseph Mansfield 14.03.2013, 15:49
quelle
3

Dies sind Elementfunktionen einer Klasse, und die Version wird basierend darauf ausgewählt, ob diese Klasse als const -Kontext verwendet wird.

Diese Version wird aufgerufen, wenn [] für ein Objekt in einem const -Kontext verwendet wird. Es behält die const -ness des zurückgegebenen Elements.

%Vor%

Diese Version wird aufgerufen, wenn [] für ein nicht const -Objekt verwendet wird. Wenn Ihr Objekt nicht const ist, erhalten Sie ein Element, das Sie ändern können, indem Sie Code wie myObject[0] = 10;

zulassen %Vor%     
Drew Dormann 14.03.2013 15:49
quelle
2

Wenn das Objekt, auf das Sie zugreifen, const ist, möchten Sie es nicht ändern können. Der Compiler würde nicht zulassen, dass Sie die nicht const Version der Funktion aufrufen.

%Vor%     
Peter Wood 14.03.2013 15:49
quelle
2

Der erste

  

const T & amp; operator [] (const int nIndex) const;

ist eine konstante Methode (Funktion), dh es garantiert, dass es keine der Klassenelementvariablen ändert (außer es ist veränderlich).

Es gibt auch ein konstantes Objekt zurück, was bedeutet, dass Sie nur konstante Funktionen aufrufen können, d. h. Sie können nur Funktionen aufrufen, die am Ende const haben, ähnlich wie oben.

  

T & amp; operator [] (const int nIndex);

Diese Methode kann die Elementvariablen ändern und gibt ein Objekt zurück, das beliebige Klassenmethoden aufrufen kann.

Wir brauchen sie beide, weil das konstante Objekt die konstante Methode und nicht konstant die andere verwenden würde.

    
Pradheep 14.03.2013 16:04
quelle