2013-10-08 16 views
12

Ich habe ein Thema, ich bin verwirrt auf, dass ich einige näher zu erarbeiten brauche. Der Operator überlädt mit einer const-Version und einer nicht-const-Version.Const und nicht-Const Operator Overloading

// non-const 
double &operator[](int idx) { 
    if (idx < length && idx >= 0) { 
     return data[idx]; 
    } 
    throw BoundsError(); 
} 

Ich verstehe, dass diese Funktion Teil einer Klasse, einen Index nimmt, und überprüft, dass seine logische, den Index der Arraydaten in der Klasse gibt. Es gibt auch eine Funktion mit dem gleichen Körper aber mit der Funktionsaufruf als

Warum brauchen wir zwei Version?

Diese Beispielfrage könnte auch hilfreich sein. Welche Version wird jeweils unten verwendet?

Array a(3); 
a[0] = 2.0; 
a[1] = 3.3; 
a[2] = a[0] + a[1]; 

Meine Hypothese, dass die const-Version nur auf a[2] genannt, weil wir a[0] oder a[1] nicht riskieren wollen ändern.

Danke für jede Hilfe.

+1

Sie können leicht überprüfen, welche mit Ausgabe in ihnen aufgerufen wird. – chris

+0

es ist in einer Vorlesung Folie so habe ich gehofft, ich würde nicht eine Klasse erstellen müssen, um sie zu nutzen, stattdessen nur jemand mir helfen zu verstehen, warum wir das tun –

+3

Sei nicht faul, probier es selbst aus, du wirst dich erinnern besser. –

Antwort

15

Wenn beide Versionen verfügbar sind, ist die Logik ziemlich einfach: const Version für const Objekte genannt wird, nicht const Version für nicht const Objekte aufgerufen wird. Das ist alles.

In Ihrem Codebeispiel a ist ein nicht const Objekt, was bedeutet, dass die nicht const Version in allen Fällen aufgerufen wird. Die const Version ist nie genannt in Ihrer Probe.

Der Punkt mit zwei Versionen ist die Implementierung von "Lese-/Schreibzugriff" für nicht-const Objekte und nur "Lesezugriff" für const Objekte. Für const Objekte const wird die Version operator [] aufgerufen, die eineReferenz zurückgibt. Sie können Daten durch diese Const-Referenz lesen, aber Sie können nicht durch sie schreiben.

+0

Ich weiß es nicht - ich fand es schwierig, die nicht-const-Version zu nennen. Sehen Sie diese Live-Demo bitte: http://coliru.stacked-crooked.com/a/1c820d80113bc9e3 –

+1

@ Reb.Cabin: In Ihrer Demo machen Sie nie irgendwelche Versuche, die nicht-const-Version von 'operator []' aufzurufen. Jedes Mal, wenn Sie eine solche Gelegenheit haben, verwenden Sie stattdessen "this -> elems [i]". Beachten Sie, dass "this -> elems" ein gewöhnlicher roher Zeiger ist. Der Operator '[]' ist der gewöhnliche * eingebaute * Indexer, nicht Ihr überladener Indexer. Wenn Sie Ihre überladene nicht-konstante Version von 'operator []' aufrufen wollen, müssen Sie '(* this) [i]' auf der linken Seite von Zuweisungen verwenden, nicht 'this-> elems [i]' . – AnT

+0

Ich sehe. Ich habe den ctor neu geschrieben und ein besseres Beispiel, um den non-const Indexer zu verwenden. Hilfreicher, klärender Kommentar. http://coliru.stacked-crooked.com/a/3a2e3960c1e77d78 –