Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

23.03.2009, 16:22

[C++]ref vs. pointer

Hab schon einige gehört man sollte Referencen statt Zeiger benutzen da zeiger mehr ein C sachen sind als C++.
Aber wann sollte man jetzt Zeiger anwenden oder Referencen.
z.b.

C-/C++-Quelltext

1
2
3
4
5
6
7
void funk(Object& obj){
   Object = Object(...);
}

//bei callbyref oder callbyval sieht man kein unterschied

funk(obj);
funk(obj);

Wenn man jetzt Referencen benutzt(und diese nicht gerade const sind)
Woher sollte man genau wissen das der Übergebe Parameter
mit hilfe der reference gesetzt wird oder einfach nur kopiert und dann gesetzt.

oder

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void funk(Object* obj){
   *Object = Object(...);
}

funk2(Object* obj){
   Object newobj;
   obj = &newobj;
}

Was passiert überhaupt mit lokalen Varaiblen die gelöscht wurden aber der Zeiger weitergegenen wurde.
(Das selbe ,was passiert mit Referencen)

2

23.03.2009, 16:58

Referenzen verhalten sich in vielen Situationen wie eingeschränkte Zeiger. Eingeschränkt, weil sie bei der Initialisierung auf ein gültiges Objekt verweisen müssen, weil sie nicht verändert werden können und weil sie keinen bewusst ungültigen Wert (Null) annehmen können. Wichtig ist auch, dass Zeiger Objekte repräsentieren, während Referenzen nur Aliase sind und theoretisch kein eigenes Objekt (und somit keinen Speicherplatz) belegen. Abgesehen davon werden Referenzen beim Zugriff automatisch dereferenziert.

Dass Zeiger eher C sind und man sie deshalb meiden sollte, ist absoluter Schwachsinn. Sie sind auch nicht so gefährlich wie oftmals dargestellt. Wenn man mit ihnen umzugehen weiss, kann man sie als mächtiges Mittel einsetzen. An vielen Orten sind sie sogar unvermeidlich.

Referenzen verwendet man oft als Parameterübergabe von Objekten (je nachdem const-qualifiziert). Dort würde ich Zeiger nehmen, wenn man Null übergeben darf. Ansonsten braucht man in gewissen Situationen die Flexibilität von Zeigern, zum Beispiel für den Aufbau von Datenstrukturen oder innerhalb von Containern. Man kann sowohl mit Zeigern als auch mit Referenzen auf ungültige Objekte verweisen, zum Beispiel, wenn diese vorzeitig zerstört werden.

P.S.: kiba, achte bitte ein wenig auf deine Sätze, lies vielleicht deine Posts vor dem Abschicken nochmals.

MasterK

Frischling

Beiträge: 92

Wohnort: Koblenz

Beruf: Teamleiter Softwareentwicklung

  • Private Nachricht senden

3

23.03.2009, 17:00

Re: [C++]ref vs. pointer

Zitat von »"kiba"«

Woher sollte man genau wissen das der Übergebe Parameter mit hilfe der reference gesetzt wird oder einfach nur kopiert und dann gesetzt.

Frage ist, ob du das wissen musst.
Wenn du die funktion aufrufst, hast du doch eine doku. Oder du kennst die funktionsdeklaration an sich. Nur die tatsache, dass du jetzt einen wert, eine referenz oder einen pointer übergibst, gibt dir doch keine ausreichende information.

Zitat von »"kiba"«

Was passiert überhaupt mit lokalen Varaiblen die gelöscht wurden aber der Zeiger weitergegenen wurde. (Das selbe ,was passiert mit Referencen)

Na, was wird da wohl passieren? :)
Zumindest bei der rückgabe einer referenz auf objekte auf dem stack meckert der compiler idR.

4

23.03.2009, 17:05

Re: [C++]ref vs. pointer

Zitat von »"MasterK"«

Wenn du die funktion aufrufst, hast du doch eine doku. Oder du kennst die funktionsdeklaration an sich. Nur die tatsache, dass du jetzt einen wert, eine referenz oder einen pointer übergibst, gibt dir doch keine ausreichende information.
Wenn man als Programmierer der Funktionen einigermassen konsistent bleibt, kann man durch die Schnittstelle bereits sehr viel aussagen. Wenn ich eine Non-Const-Referenz sehe, gehe ich davon aus, dass das übergebene Objekt verändert wird. Bei einer Const-Referenz hingegen vertraue ich darauf, dass nirgendwo ein const_cast dahinter steckt. Bei einem Zeiger ist es üblich, dass Null übergeben werden kann. Das soll natürlich nicht heissen, dass man sich nicht mehr mit der Doku auseinandersetzen sollte, sondern, dass die Deklaration dem Anwender bereits einiges mitteilen kann.

Zitat von »"MasterK"«

Zumindest bei der rückgabe einer referenz auf objekte auf dem stack meckert der compiler idR.
Darauf sollte man sich aber nicht verlassen, zudem ist es meist nur eine Warnung. Man sollte selbst sicherstellen, dass die Objekte noch existieren, wenn man per Zeiger oder Referenz auf sie zugreift.

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

5

23.03.2009, 17:16

Wenn man Referencen ja auf keinen NULL wert setzen kann
sollte man also bei Klassen lieber Pointer verwenden da z.b. in Standard Konstruktoren die pointer einfach mit NULL belegen kann.

6

23.03.2009, 17:50

Kann man so pauschal nicht sagen. Das hängt unter anderem davon ab, ob ein Null-Wert akzeptabel ist und ob der Verweis während der ganzen Lebensdauer der Instanz der gleiche bleiben soll.

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

7

23.03.2009, 17:59

Gibt es denein paar Faustregen oder Tipps von euch profies.
z.b.
Lieber Referencen statt const zeiger.

8

23.03.2009, 18:20

Zitat von »"kiba"«

Gibt es denein paar Faustregen oder Tipps von euch profies.
z.b.
Lieber Referencen statt const zeiger.

wenn du ein größeres objekt an eine funktion als einfachen, nur-lese Parameter übergibst, mach ne const-reference.
Wenn du ein objekt von der funktion aus verändern willst, übergib nen Zeiger oder ne referenz, je nachdem, was dir lieber ist, außer bei inlines, da kann bei referenzen eher optimiert werden.
Wenn du ein Verweis auf ein Objekt speichern willst, nimm nen zeiger, den kann man nämlich immer wieder ändern - außer, wenn das objekt von der erzeugung der referenz bis zu ihrer vernichtung das selbe bleiben soll.

PS: falls irgendwer das begründet anders sieht, ich lasse mich gerne verbessern ;)

9

23.03.2009, 18:38

Das ist ein viel zu größes Thema für einen Thread, deshalb:
Kaufen. Lesen. =)
http://www.amazon.de/Effektiv-programmieren-Moeglichkeiten-Programme-verbessern/dp/3827326907/ref=sr_1_8?ie=UTF8&s=books&qid=1237829575&sr=8-8

Gruß
Markus

10

23.03.2009, 19:36

Zitat von »"kiba"«

Gibt es denein paar Faustregen oder Tipps von euch profies.
z.b.
Lieber Referencen statt const zeiger.
Liest du meine Beiträge auch? Ich habe mir extra die Mühe gegeben und versucht, dir einige Anwendungsfälle aufzuzeigen. :roll:

Zitat von »"PCShadow"«

Wenn du ein objekt von der funktion aus verändern willst, übergib nen Zeiger oder ne referenz, je nachdem, was dir lieber ist, außer bei inlines, da kann bei referenzen eher optimiert werden.
Warum sollte bei Referenzen eher optimiert werden können? Nach dem Compilevorgang läuft es eh in fast allen Fällen darauf hinaus, dass Referenzen wie Zeiger gehandhabt werden.

Werbeanzeige