C++ Übergabe von Objekten per Referenz
Ich versuche zu lernen, C++, und ich arbeite durch "Sams Teach Yourself C++ in 21 Tagen".
Habe ich Fortschritte erzielt wurden, ganz gut so weit, und hab auch durch das Kapitel über Zeiger ohne Schwierigkeit. Jedoch, eine Liste über "die Übergabe von Objekten per Referenz" verlassen hat mich ziemlich verwirrt.
Es ist eine Klasse mit zwei Konstruktoren:
class SimpleCat
{
public :
SimpleCat();
SimpleCat(SimpleCat&);
...
};
zwei Funktionen mit dem Prototyp:
SimpleCat FunctionOne( SimpleCat theCat );
SimpleCat* FunctionTwo( SimpleCat *theCat );
/ Was irritiert mich, dass beim Aufruf der zweiten Funktion, der zweite Konstruktor SimpleCat(SimpleCat&);
genannt wird. Könnte mir bitte jemand erklären? Jede weitere Suche hat mich verlassen gleichermaßen verwirrt. /
EDIT: ich habe einen Fehler in meinem post hier, der copy-Konstruktor (wie ich jetzt weiß, was es ist, danke so viel ) als die erste Funktion. Ich bin sorry für die Verwirrung. Ich weiß, verstehen Sie den link jetzt und Sie haben alle enorm geholfen.
- Könntest du ein bisschen mehr code? Ich würde erwarten, dass die SimpleCat(SimpleCat&) - Konstruktor aufgerufen werden, für FunctionOne und NICHT FunctionTwo.
- Für den Datensatz, jedes Buch, die behaupten, dass Sie können lehren Sie C++ in Tagen ist nur noch Müll. IMHO C++ ist eine sehr komplexe Sprache und was bedeutet es kann gelernt werden, in ein paar Tagen ist nur ... gefährlich.
- Bitte poste den Inhalt von FunctionOne und FunctionTwo: wahrscheinlich ist der Anruf zu Ihrem copy-Konstruktor fertig ist irgendwo im Körper, und nicht in die sich selbst aufrufen.
- K.: es lehrt, wie man in C++ Programmieren, es nicht lehren, wie zu programm auch in C++ 🙂
- Amen. Das Buch sollte aufgerufen werden, "um etwas zu syntaktisch pass Zusammenstellung in 21 Tagen". Ich arbeite mit C++ hin und her, während 10 Jahre und mich selbst immer noch als Neuling. Ich bezweifle, dass es mehr als eine Handvoll Leute in der ganzen Welt, dass weiß eigentlich jeder einzelne wählerisch detail der Sprache.
- zu @Matthew & @Anders: "Teach Yourself Programming in Ten Years" norvig.com/21-days.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
SimpleCat(SimpleCat&)
ist ein copy-Konstruktor.SimpleCat FunctionOne(SimpleCat theCat)
verwendet pass-by-value Semantik. Dies erfordert, dass die Klasse-Instanz kopiert werden. Daher der Aufruf der copy-Konstruktor.Kann ich nicht reproduzieren, das Verhalten, das Sie beschreiben. Wie Sie sehen können hier der copy-Konstruktor wird nur aufgerufen, wenn Sie anrufen
FunctionOne
.Bearbeiten darunter den code direkt hier, so dass es leichter zu Lesen ist.
Quelle:
Ausgabe:
Einen Konstruktor eine Referenz auf seine eigene Art wird als eine "Kopie-Konstruktor" (in Ihrem Buch).
Wann immer der compiler braucht, um eine Kopie von einem Objekt eines bestimmten Typs, wenn die definition der Klasse einen copy-Konstruktor wird es benutzen, ansonsten benutzt es eine Standard-Implementierung, die es bietet. Also der copy-Konstruktor ermöglicht Ihnen zu kontrollieren, wie Ihre Klasse kopiert.
Wahrscheinlich dein copy-Konstruktor wird verwendet, wenn Sie anrufen
FunctionOne
, nichtFunctionTwo
da der parameter wird als Wert übergeben.Ihre FunctionOne nimmt ein Objekt VON WERT.
Das bedeutet, dass, Wann immer die Funktion aufgerufen wird, eine Kopie gemacht wird der Datentyp. Dies gilt auch für die gewöhnlichen Datentypen wie int, char, ..., aber auch für die Objekte (in deinem Fall ein SimpleCat-Objekt).
Also, wenn Sie eine Funktion wie
void doIt(int a)
, dann, wenn Sie anrufen doIt(3), der Wert 3 ist kopiert von erstellen einer neuen Instanz eine ganze Zahl mit dem Wert 3.Übersetzt auf Ihr
FunctionOne
AufrufFunctionOne(cat)
wird eine kopieren Ihrer Katze-Objekt, was in den copy-Konstruktor aufgerufen wird.