Frage

In C ++, die Signatur eine Funktion hängt zum Teil davon ab, ob oder nicht, es ist konst. Das bedeutet, dass eine Klasse zwei Elementfunktionen mit identischen Signaturen aufweisen kann, außer dass ein const ist und der andere nicht. Wenn Sie eine Klasse wie diese haben, dann wird der Compiler entscheiden, welche die Aufgabe zugrunde, rufen Funktion, die Sie nennen es auf: Wenn es sich um eine const Instanz der Klasse ist, wird die const-Version der Funktion genannt; wenn das Objekt nicht const wird, wird die andere Version aufgerufen werden.

In welchen Umständen könnten Sie die Vorteile dieser Funktion nehmen?

War es hilfreich?

Lösung

Das ist wirklich nur dann sinnvoll, wenn der Member-Funktion einen Zeiger oder einen Verweis auf ein Datenelement der Klasse zurückgibt (oder ein Mitglied eines Mitglieds, oder ein Mitglied eines Mitglieds eines Mitglieds, ... etc.). Im allgemeinen Rückkehr nicht konstante Zeiger oder Verweise auf Datenelemente ist verpönt, aber manchmal ist es sinnvoll oder einfach sehr bequem (z Operator []). In solchen Fällen bieten Ihnen eine konstante und eine nicht-const Versionen des Getter. Auf diese Weise die Entscheidung, ob oder nicht das Objekt kann mit der Funktion ruht modifiziert werden, indem sie, die eine Wahl hat es const oder nicht-const deklariert.

Andere Tipps

Es ist da, so dass Sie den Compiler erzwingen können, ob Sie ein konstantes Objekt oder einen regulären zurückzukehren, und immer noch die gleiche Methode Unterschrift erhalten. Es gibt eine ausführliche Erklärung unter Konst Correctness .

Vielleicht möchten Sie es verwenden, um zu entscheiden, ob eine konstante Referenz auf ein Objekt zurückkommen oder nicht. Die Container der STL verwenden eine const beginnen überlastet () und end () Funktion, um zu entscheiden, ob eine const_iterator oder eine normale Iterator zurück.

Haben Sie einen Blick auf das Verhalten von std :: map :: operator []. Die const Version wirft einen Fehler, wenn Sie versuchen, einen ungültigen Schlüssel zu verweisen, aber die nicht-const-Version tut einen Einsatz. Das Einsetzen Verhalten ist viel handlicher als mit std verwenden :: map :: insert (und wird ein Überschreiben tun, darüber hinaus), kann aber für eine konst Karte nicht funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top