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.
Welche Sprache verwenden Sie? Sie sollten die Frage mit der Sprache versehen, wenn Sie möchten, dass sie die richtige Aufmerksamkeit erhält. – Oded
bearbeitet, Sprache, die ich verwende, ist C++ –
Sie können den Rückgabetyp in C++ nicht überladen. – Job