was ist in "const T & operator [] (size_type i)" gut?

8

Ich fand diese interessante Zeile in: einem Buch Ссылка - Quellen - Kapitel 11 - Vec.h (Ich bin ein std :: Vektor-Remake)

Und ich verstehe nicht wirklich, wofür diese Version des Operators gut ist. Warum sollten zwei Versionen (const und nicht-const) dieses Operators definiert sein?

Ich habe es sogar ausprobiert und es scheint mir, dass die non-const-Version ständig aufgerufen wird ... Kannst du es bitte erklären?

%Vor%

Danke!

    
Novellizator 24.11.2011, 00:27
quelle

2 Antworten

10

Ganz sicher war das

%Vor%

Const signalisiert dem Compiler, dass der Rückgabewert nicht durch den aufrufenden Code geändert werden darf.

Das hat zu tun mit:

  • die Rückgabe als Referenz wäre unsicher, wenn die Referenz änderbar wäre
  • die Rückgabe als Referenz kann viel effizienter sein als die Rückgabe nach Wert
  • Nicht-konstante Methoden können nicht für const-Objekte (Instanzen)
  • aufgerufen werden
  

Begründung : Wenn das deklarierende Objekt selbst const ist, gibt es keine Möglichkeit, dass die Methode einen Verweis auf ein (Teil von) einem Mitglied zurückgibt non-const ; Const-ness cascades wenn Sie wollen: dies wird als const-correctness bezeichnet.

In der Praxis sieht man oft const / non-const Überladungen wie folgt:

%Vor%

Verwandte Themen:

  • Weitgehend gilt das Gleiche für die weniger bekannte volatile Modifikator
  • Ein verwandtes Keyword (die Umkehrung, wenn Sie so wollen) zu const ist mutable
sehe 24.11.2011, 00:31
quelle
1

C ++ erlaubt das Überladen von Elementfunktionen, die sich nur in der Konsistenz unterscheiden. Die zwei Mitgliedsfunktionen in Ihrer Frage sind:

%Vor%

Der erste Indizierungsoperator wird aufgerufen, wenn Sie ein nicht-konstantes Objekt vom Typ Vec haben. Die zweite wird aufgerufen, wenn Sie ein const-Objekt vom Typ Vec haben. Wenn Sie nicht über die zweite Elementfunktion verfügen, würde der Versuch, den Indexierungsoperator für eine Variable zu verwenden, die eine Konstante Vec ist, zu einem Kompilierungsfehler führen.

In Ihrem Beispiel versuchen Sie Folgendes zu main hinzuzufügen, nachdem Sie v eingerichtet haben, um zu sehen, was passiert.

%Vor%     
David Alber 24.11.2011 00:40
quelle

Tags und Links