79 Stimmen

Wozu dient die Überladung von const in C++?

In C++ hängt die Signatur einer Funktion teilweise davon ab, ob sie const ist oder nicht. Das bedeutet, dass eine Klasse zwei Mitgliedsfunktionen mit identischen Signaturen haben kann, mit der Ausnahme, dass eine konstant ist und die andere nicht. Bei einer solchen Klasse entscheidet der Compiler auf der Grundlage des Objekts, für das die Funktion aufgerufen wird, welche Funktion aufgerufen wird: Wenn es sich um eine konstante Instanz der Klasse handelt, wird die konstante Version der Funktion aufgerufen; wenn das Objekt nicht konstant ist, wird die andere Version aufgerufen.

Unter welchen Umständen würden Sie diese Funktion nutzen wollen?

46voto

Dima Punkte 37984

Dies ist nur dann sinnvoll, wenn die Memberfunktion einen Zeiger oder eine Referenz auf ein Datenmitglied Ihrer Klasse zurückgibt (oder ein Mitglied eines Mitglieds, oder ein Mitglied eines Mitglieds eines Mitglieds, ... usw.). Im Allgemeinen ist die Rückgabe von Zeigern oder Verweisen auf Datenelemente, die nicht konstant sind, verpönt, aber manchmal ist es vernünftig oder einfach sehr praktisch (z. B. der []-Operator). In solchen Fällen bieten Sie eine const- und eine non-const-Version des Getters an. Auf diese Weise liegt die Entscheidung, ob das Objekt geändert werden kann oder nicht, bei der Funktion, die es verwendet und die die Wahl hat, es als const oder non-const zu deklarieren.

28voto

Bill the Lizard Punkte 384619

Sie ist dazu da, damit der Compiler erzwingen kann, ob Sie ein const-Objekt oder ein normales Objekt zurückgeben, und trotzdem die gleiche Methodensignatur beibehalten können. Eine ausführliche Erklärung finden Sie unter Konst Korrektheit .

9voto

RobH Punkte 3169

Schauen Sie sich das Verhalten von std::map::operator[] an. Die const-Version gibt einen Fehler aus, wenn Sie versuchen, einen ungültigen Schlüssel zu referenzieren, aber die non-const-Version führt eine Einfügung durch. Das Einfügeverhalten ist viel praktischer als die Verwendung von std::map::insert (und führt außerdem ein Überschreiben durch), kann aber bei einer const-Map nicht funktionieren.

5voto

Jasper Bekkers Punkte 6545

Sie können es verwenden, um zu entscheiden, ob Sie eine const-Referenz auf ein Objekt zurückgeben wollen oder nicht. Die Container der STL verwenden eine überladene Funktion const begin() und end(), um zu entscheiden, ob ein const_iterator oder ein normaler Iterator zurückgegeben werden soll.

0voto

user265906 Punkte 80
#include <iostream>
using namespace std;
class base
{

public:
void fun() const
{
    cout<<"have fun";
}
void fun()
{
    cout<<"non const";
}

};
int main()
{
    base b1;
    b1.fun(); //does not give error
    return 0;
}

Hier wird der Compiler keinen Fehler ausgeben, denn im Falle von const Funktionen konvertiert der Compiler this Zeiger auf const this* . dieses dritte Argument trennt diese beiden Funktionen.

2 Stimmen

Sie haben nicht erklärt, warum const Qualifier bei Mitgliedsfunktionen überhaupt benötigt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X