2010-12-19 11 views
2

Ich habe mich C++ in den letzten paar Tagen gelehrt, und habe in einigen Situationen, die ich verwenden könnte, einige weitere Erklärungen auf. Was ist der Unterschied zwischen den folgenden Methoden neben der offensichtlichen Klasse, Benennung, etc?Ich bin ein wenig verwirrt über Speicher Zeiger

void OnTimer(wxTimerEvent &event) ... 

void addNPC(Sprite *spr) ... 

Werden beide Methoden die Werte als Referenz übergeben und das gleiche tun? Wenn ja, worin besteht der Unterschied? Als ich das erste Lesung begann, sah ich die Methode wie folgt genannt:

addNPC(&sprite); 

So ging ich davon aus, dass, wenn Sie eine Methode geschrieben, die einen Speicherzeiger, in der Methodenargumente würde empfangen Sie es schreiben müssen, wie Sie wurden erklärt ein Speicherzeiger/Speicherort und nicht nur ein Wert. Aber dann schaue ich auf die OnTimer-Methode, und ich sehe, dass auch eine Referenz übergeben wird. Was ist der Unterschied?

Schließlich, sind diese beiden Dinge die gleichen, und nur tatsächliche Codierungsstile?

void addNPC(Sprite& spr) ... 
void addNPC(Sprite &spr) ... 
+0

Hausaufgaben? ------ :-) –

+0

Ich denke nicht :-) – anatolyg

+0

Hah. Nein, C++ ist noch nie zuvor gemacht worden. Und wirklich einfache Arbeit zu tun, um es in sich versinken. – Nathan

Antwort

1
void addNPC(Sprite *spr) 

In obigem Code, müssen Sie wie unten stehende Adresse von Sprite-Objekt übergeben, wie es Zeiger empfängt.

addNPC(&sprite); 

Und für die Funktion

void OnTimer(wxTimerEvent &event) 

Aufruf wie unten sein muss, wie es Bezug auf wxTimerEvent Aufgabe übernimmt.

wxTimerEvent evt; 
OnTimer(evt);//Passing object by reference. 

An Stelle anrufen, ist Syntax gleiche für sowohl Pass von Wert und übergeben von Referenz.

Und für Ihre letzte Frage, sie sind beide gleich, nur die Codierung Stilunterschied.

4

Letzte Frage zuerst: Die beiden Funktions-Prototypen sind gleichwertig. Leerzeichen sind in C oder C++ meist nicht signifikant.

Für den Unterschied zwischen Referenzen und Zeigern, denken Sie an eine Referenz als "syntaktischer Zucker" für einen Zeiger, mit der zusätzlichen Einschränkung, dass es nicht NULL sein kann. Weitere Informationen hierzu finden Sie in der C++ - FAQ: https://isocpp.org/wiki/faq/references

+1

Bitte ** versuchen Sie nicht, Ihr Verständnis von Referenzen aus einem bestehenden Verständnis von Zeigern abzuleiten. Wenn überhaupt, sollte es umgekehrt sein. Zu der Zeit, wenn Sie genügend "außer" s zu Ihrem Zeiger-abgeleiteten mentalen Modell einer Referenz hinzugefügt haben, um wirklich genau zu sein, sind Sie nicht besser dran als Sie begonnen haben. Aber ** tue ** den Link - erstklassiges Material dort. –

+0

Du hast wahrscheinlich recht, dass es besser ist, von Zeigern in Bezug auf Referenzen zu denken, wenn Sie von einer anderen Programmiersprache kommen. Ich wurde von unten nach oben unterrichtet, von der Hardware bis zum Betriebssystem, also kamen die Zeiger zuerst (vor allem, weil ich bis zu diesem Zeitpunkt nicht den Standard-Referenzsprachen ausgesetzt war). –

+0

Danke für den Link. Ich dachte, ich hätte etwas, womit ich anfangen könnte. :) – Nathan

1

wxTimerEvent &event ist eine Referenz auf ein Objekt. Es verhält sich wie eine normale Variable und sieht wie eine normale Variable aus, verweist jedoch auf eine Variable außerhalb der Funktion. Alle Änderungen an den lokalen Referenzen ändern tatsächlich das Original. Es ist im Wesentlichen ein Zeiger, auf den Sie als normale Variable zugreifen können, und es kann nicht NULL sein.

Sprite *spr ist ein echter Zeiger auf eine äußere Variable. Alle lokal vorgenommenen Änderungen werden auch außerhalb der Funktion vorgenommen. Es kann NULL sein!

Die letzten beiden Elemente sind identisch. Leerzeichen sind nicht wichtig in C/C++ - Code.

1

Zusätzlich zu anderen Antworten gibt es eine Funktion der const-Referenz - Sie können ihr ein temporäres Objekt zuweisen, und das Objekt wird so lange leben, wie die const-Referenz aktiv ist.

So verwenden Sie Referenzen, wenn der Benutzer der Referenz nicht für die Zerstörung des Objekts verantwortlich UND wenn NULL-Objekt keinen Sinn macht.

Hier Ehren GotW #88 zur Erläuterung const Verweis auf temporäre Objekt.

Verwandte Themen