Kann Überladung ist möglich mit zwei Version der Funktion, Konstante Member-Funktion und Funktion ohne const

8

Ich bin gerade auf verschiedene Überlademethoden gestoßen, wie Art des übergebenen Parameters, variierende Anzahl von Parametern, Rückgabetyp usw. Ich möchte nur wissen, dass ich eine Funktion mit folgenden zwei Versionen überladen kann

%Vor%

Bitte lassen Sie mich den Grund dafür wissen.

    
GG. 16.06.2010, 19:47
quelle

5 Antworten

9

Ja, das kannst du.

Wenn Sie

haben %Vor%

Die nicht-konstante Version wird aufgerufen. Wenn du

hast %Vor%

Die const-Version wird aufgerufen.

    
Job 16.06.2010, 20:01
quelle
3

Der einfachste Weg, dies zu verstehen, besteht darin, sich das Objekt, auf das Sie die Methode anwenden, als 0. Parameter vorzustellen:

z. B .: Denken Sie an

%Vor%

als eine extravagante, vom Compiler unterstützte Methode, dies zu tun:

%Vor%

Jetzt ist das Überladen auf der Grundlage von constness nur ein Spezialfall der Überlastung durch Parametertypen:

%Vor%

kann man sich so vorstellen:

%Vor%

Was die Nützlichkeit dieser Methode angeht, sind die Methoden begin und end für verschiedene std:: -Container die einfachsten Beispiele. Wenn vector / string / was auch immer nicht const ist und Sie begin() aufrufen, erhalten Sie eine iterator zurück, mit der Sie den Inhalt des ursprünglichen Containers ändern können. Dies sollte natürlich für Container, die mit const markiert sind, nicht erlaubt sein. Daher ruft% ce_de% bei einem const-Vektor dank der const / non const-Überladung einen begin() auf, der zum Lesen des Inhalts des Vektors verwendet werden kann , aber nicht ändern.

z.B.

%Vor%

Was das Überladen nach Rückgabetyp betrifft, können Sie es in C ++ nicht tun. Sie können jedoch ziemlich anständig simulieren

    
Eclipse 16.06.2010 20:13
quelle
2

Ja, Sie können das tun. (@Job, dies ist keine Überladung beim Rückgabetyp, dies ist eine Überladung auf 'const-state' der aufgerufenen Klasseninstanz)

Wenn die Instanz const ist, wird die zweite Variante aufgerufen, wenn nicht, wird die erste aufgerufen. Der praktische Nutzen ist, dass, wenn die Methode für eine konstante Instanz aufgerufen wird, Sie wahrscheinlich auch eine "const String & amp;" (z. B. wenn Sie einen Verweis auf ein Mitglied der Klasse zurückgeben), etwa so:

%Vor%     
Patrick 16.06.2010 20:05
quelle
2

So wird der Iterator verwendet. Sie haben einen konstanten Iterator sowie einen nichtkonstanten Iterator.

    
Jumix 16.06.2010 20:25
quelle
1

Dies ist nicht nur möglich, es ist ein allgemein verwendetes Idiom.

Wenn beispielsweise die const -Version einer Funktion aufgerufen wird, kann eine Referenz auf eine schreibgeschützte Version eines Ergebnisses zurückgegeben werden. Wenn jedoch die nicht const Version aufgerufen wird, wird eine Kopie erstellt und zurückgegeben, die der Empfänger ändern kann. Durch die Implementierung einer const Version werden wir von der Ausführung der Konstruktion gerettet, wenn wir wissen, dass sie nicht benötigt wird.

    
sigfpe 16.06.2010 20:05
quelle