2010-06-16 3 views
8

Ich stieß gerade auf verschiedene Überladungsmethoden wie Parameter übergeben, variierende Anzahl von Parametern, Rückgabetyp usw. Ich will nur wissen, dass ich kann Überlastung eine Funktion mit folgenden zwei VersionKann Überlastung ist möglich mit zwei Version der Funktion, Konstante Member-Funktion und Funktion ohne const

 

//function which can modify member 
String& MyClass::doSomething(); 

//constant member function 
String& MyClass::doSomething() const; 

Bitte lassen Sie mich wissen, den Grund dafür.

+0

Welche Sprache verwenden Sie? Sie sollten die Frage mit der Sprache versehen, wenn Sie möchten, dass sie die richtige Aufmerksamkeit erhält. – Oded

+0

bearbeitet, Sprache, die ich verwende, ist C++ –

+0

Sie können den Rückgabetyp in C++ nicht überladen. – Job

Antwort

9

Ja, Sie können.

Wenn Sie

MyClass m; 
m.doSomething(); 

Die nicht-const-Version aufgerufen werden müssen. Wenn Sie haben

const MyClass m; 
m.doSomething(); 

Die const-Version wird aufgerufen werden.

2

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

Wenn die Instanz const ist, wird die zweite Variante aufgerufen, wenn dies nicht der Fall ist der erste heißt. Die praktische Anwendung ist, dass, wenn das Verfahren auf einer const Instanz aufgerufen wird, werden Sie wahrscheinlich auch eine zurückkehren wollen „const String &“ (zB, wenn Sie Rückkehr einen Verweis auf ein Mitglied der Klasse), wie folgt aus:

//function which can modify member 
String& MyClass::doSomething(); 

//constant member function 
const String& MyClass::doSomething() const; 
+0

Ich weiß, die Frage war nicht über Überlastung bei Rückgabetyp, aber er hat in seiner Frage erwähnt, dass er dachte, dass dies möglich ist. – Job

1

Nicht nur ist das möglich, es ist ein allgemein verwendetes Idiom. Wenn die const Version einer Funktion aufgerufen wird, kann z. B. ein Verweis 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.

3

Der einfache Weg, dies zu verstehen, ist von dem Objekt zu denken, dass Sie die Methode auf als der 0-ten Parameter aufrufen:

zB: Denken Sie an

String& MyClass::doSomething(); 
MyClass mc; 
mc.doSomething(); 

als extravagant, Compiler unterstützt Weg dies zu tun: Jetzt

String& MyClass_doSomething(MyClass *this); 
MyClass mc; 
MyClass_doSomething(&mc); 

, auf Konstantheit basiert Überlastung ist nur ein Spezialfall von Überlastung durch Parametertypen:

String& MyClass::doSomething(); 
String& MyClass::doSomething() const; 

kann durch Gedanken an so etwas wie folgt aus:

String& MyClass_doSomething(MyClass *this); 
String& MyClass_doSomething(const MyClass *this); 

In Bezug auf die usefullness dieser, sind die einfachsten Beispiele die begin und end Methoden auf verschiedenen std:: Containern. Wenn die vector/string/was auch immer nicht const ist, und Sie begin() aufrufen, erhalten Sie eine iterator zurück, die verwendet werden kann, um den Inhalt des ursprünglichen Containers zu ändern.Dies sollte für Container, die mit const markiert sind, natürlich nicht erlaubt sein, also kann der Aufruf von begin() auf einem konstanten Vektor eine const_iterator zurückgeben, die verwendet werden kann, um den Inhalt des Vektors zu lesen, aber nicht zu ändern.

z.B.

string nc = "Hello world"; 
for (string::iterator iString = nc.begin(); iString != nc.end(); ++iString) 
{ 
    cout << *iString;; // legal to read 
    *iString = toupper(*iString); // legal to write 

} 

const string c = "Hello world again"; 
for (string::const_iterator iString = c.begin(); iString != c.end(); ++iString) 
{ 
    cout << *iString;; // legal to read 
    // *iString = toupper(*iString); // Writing is illegal 
} 

Zum Überladen von Rückgabetyp, können Sie es nicht in C++ tun. Sie können jedoch simulate it ziemlich anständig.

2

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

Verwandte Themen