Zum Inhalt springen

C++ und Referenzen


Technician

Empfohlene Beiträge

Eigentlich sind Referenzen ganz einfach erklärt: Referenzen sind konstante Zeiger - so steht´s jedenfalls beim Stroutrup (einfach ausgedrückt). Das stimmt nicht ganz so - aber das sind Kleinigkeiten um die man sich streiten, weil man´s so am Besten kapiert. Wenn also die Zeiger nie verändert werden dürfen verwendet man, um das auch klar auszudrücken, die Referenzen. Deshalb sind die auch kompatibel (jedenfalls von der Referenz zum Zeiger) und man spricht bei beiden vom Referenzieren &-bei der Referenz *beim Zeiger und Dereferenzieren der Referenzname bei Variablen . bei Objektreferenzen und -> beim Zeiger. Ein Unterschied wäre noch, daß eine Referenz niemals 0 sein darf - ein Zeiger hingegen schon. Machen tun beide dasselbe: Sie zeigen auf eine Position im Speicher, in denen von dort an aufsteigend die Daten gespeichert sind. Mir ist auch nie aufgefallen, daß eine Referenz noch eine andere Bedeutung hätte. Vermutlich war die Referenz vom C her zuerst da, weil man die benötigt um einen Zeiger auf eine schon existierende Variable zeigen zu lassen. Beim Zeiger gibt´s noch eine Erweiterung: Den Zeiger auf Zeiger (**), welcher, verständlich ausgedrückt, nichts weiter als ein Array ist!!! Man kann Zeiger auf Zeiger tatsächlich als Array ansprechen (mit []-Operator) und erhält dann den korrekten Datentyp und Arrayeintrag, ansonsten einfach den Zeiger Dereferenzieren und erhält das erste Element des Arrays. Ein wichtiges Thema wenn man mit sowas arbeitet ist aber die Bereichsprüfung!!!

http://www-info2.informatik.uni-wuerzburg.de/dclc-faq/kap2.html

http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/pointers.html

http://www.informatik.uni-hildesheim.de/SS2000/c-mo/pic_00_v07.ppt

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Crush

Eigentlich sind Referenzen ganz einfach erklärt: Referenzen sind konstante Zeiger - so steht´s jedenfalls beim Stroutrup. Wenn also die Zeiger nie verändert werden dürfen verwendet man, um das auch klar auszudrücken, die Referenzen. Deshalb sind die auch kompatibel (jedenfalls von der Referenz zum Zeiger) und man spricht bei beiden vom Referenzieren &-bei der Referenz *beim Zeiger und Dereferenzieren der Referenzname bei Variablen . bei Objektreferenzen und -> beim Zeiger. Machen tun beide dasselbe: Sie zeigen auf eine Position im Speicher, in denen von dort an aufsteigend die Daten gespeichert sind. Mir ist auch nie aufgefallen, daß eine Referenz noch eine andere Bedeutung hätte. Vermutlich war die Referenz vom C her zuerst da, weil man die benötigt um einen Zeiger auf eine schon existierende Variable zeigen zu lassen. Beim Zeiger gibt´s noch eine Erweiterung: Den Zeiger auf Zeiger (**), welcher, verständlich ausgedrückt, nichts weiter als ein Array ist!!! Man kann Zeiger auf Zeiger tatsächlich als Array ansprechen (mit []-Operator) und erhält dann den korrekten Datentyp und Arrayeintrag, ansonsten einfach den Zeiger Dereferenzieren und erhält das erste Element des Arrays. Ein wichtiges Thema wenn man mit sowas arbeitet ist aber die Bereichsprüfung!!!

... soweit ebenfalls das Skript aus der BS ;)

Es geht mir konkret darum:

Ich hab da gestern so ein bisschen C++ gecodet, und da kommt mein Mentor grad mal gucken und sagt "Was, ihr macht das alles mit Pointern :eek:, Referenzen sind doch viiiiel besser!"

Referenzen wurden in der BS nur mal kurz angesprochen (Umfang und Inhalt so eine Erklärung wie deine) und das Thema wurde auch als nicht sooooo bedeutsam gehalten.

Mein Mentor scheint aber die Bedeutung der Referenzen ein wenig anders zu sehen ;)

Aus diesem Grund suche ich also was schön Ausführliches, so schön mit Beispielen und so.

Ach ja, es geht um OOP...

Gruß,

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wir hatten das schon oefter, und Einigkeit besteht auch in den massgeblichen Newsgroups in folgenden Feststellungen:

REFERENZEN soll man (in C++) benutzen, wann immer moeglich.

POINTER soll man lediglich benutzen, wenn man muss!

Eine Referenz ist ein anderer Name fuer ein Objekt, also ein Alias. Sie verwaltet es intern mit Hilfe von Adressen, ist aber syntaktisch kein Pointer. Der Hauptvorteil liegt in der Ersparnis von Tipparbeit, was zu mehr Uebersichtlichkeit und weniger Fehlern fuehrt, mehr nicht.

Das was Crush da aus dem Stroustroup wiedergegeben hat, ist eher eine der vielen unsauberen Uebersetzungen, denn eine Referenz muss ja keineswegs konstant sein!

Bei dieser Geschichte mit den Handles hab ich Zweifel, ein Array ist auf jeden Fall nicht ganz das Gleiche.

Uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Technician

Werden in der OOP tatsächlich Referenzen anstelle von Pointern auf Objekte verwendet? :confused:

Ja, lang und schmutzig. In Java z. B. ist es sogar die einzige Moeglichkeit, mit Objekten zu arbeiten:

MyClass myObjekt=null; // Objektreferenz, initialisiert mit Nullreferenz

myObjekt = new MyClass(); // Instantiierung und Allokation von Speicher

In C++ ist das alles variantenreicher:

Klasse objekt; // Instantiierung auf dem Stack

Klasse* pobjekt = new Klasse(); // im Heap

Klasse &refobjekt; // Deklaration einer Referenz

refobjekt = objekt // refobjekt referenziert objekt

refobjekt = *pobjekt // refobjekt referenziert pobjekt

Man sieht, refobjekt kann tatsaechlich ueberall dort stehen, wo sonst ein Objektname steht, obwohl es kein Objekt ist.

Uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

Öh, Uli...

"Das was Crush da aus dem Stroustroup wiedergegeben hat, ist eher eine der vielen unsauberen Uebersetzungen, denn eine Referenz muss ja keineswegs konstant sein!"

Soll das heißen, man kann eine Referenz nach der Initialisierung ERLAUBT verändern? Wie denn (außer wenn ich brutal versuche im Speicher die Referenz zu überschreiben - hab ich aber noch gar nicht probiert)? Geht das überhaupt - im Rahmen der Standard-Syntax???

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Crush

Soll das heißen, man kann eine Referenz nach der Initialisierung ERLAUBT verändern?

Klar, wieso nicht? In Java z. B. macht man das andauernd.

Dies hier geht jedenfalls:

#include <iostream>


class A { 

public: 

 void blah(const char* s) {

 cout<<s<<endl;

 }

};


int main()

{

A a;

A b;

A &r = a;


a.blah("Ich werde von Objekt a aufgerufen");

r.blah("Ich werde von einer Referenz aufgerufen, die auf a weist");


r = b;

r.blah("Ich werde von der selben Referenz aufgerufen, die nun aber auf b weist");


return 0;

}

Allerdings enthaelt mein letztes Posting einen Fehler; Referenzen koennen nicht leer deklariert werden, sondern muessen initialisiert werden. :rolleyes:

Uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist das nicht der Beweis, daß Referenzen eigentlich dasselbe sind wie Zeiger, wenn man mal von der Initialisierung absieht? Wenn man im allgemeinen Sprachgebrauch von Programmierern reinschaut wird eine Referenz oft auch als Synonym zu Zeiger verwendet! Da der Unterschied so Minimal ist braucht man sich doch gar nicht so darum die einzelne Haare auszuraufen, oder? Technisch mag eine Referenz in jeder Sprache evtl. mit einer anderen Eigenheit oder Differenz zum Zeiger belegt sein, das ist aber meist eine Frage der Syntax die sich die "Erschaffer" überlegt haben und der Namensvergabe bestimmter Spracheigenheiten. Vielleicht kommt mal einer auf die Idee eine Variable in einer Programmiersprache als einen Zeiger zu titulieren und dann werden sich mal wieder Heerschaaren verwirrter Programmierer gegenseitig gegen´s Knie treten... und der Dritte lacht darüber.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Crush

Ist das nicht der Beweis, daß Referenzen eigentlich dasselbe sind wie Zeiger, wenn man mal von der Initialisierung absieht?

"eigentlich dasselbe"? :eek:

Also ichwill mal so sagen, mit Zeigern kann man zwar referenzieren, aber das bedeutet nicht, dass Zeiger Referenzen sind.

Uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn es keinen Unterschied gäbe wäre es ja nicht notwendig ein eigenes Zeichen mit eigener Bezeichnung für Referenzen und Zeiger zu definieren ... mal logisch betrachtet. Es geht ja nur ums Prinzip - und das ist bei beiden täuschen ähnlich ...

Jetzt verwirren wir die Technician allerdings noch vollkommen - der wird bestimmt ganz schwindlig wenn die das hier liest. Hoffentlich konnten wir ihr weiterhelfen und sie nicht noch konfuser machen als es ohnehin schon ist.

Was mich ja auch etwas irritiert war die Aussage, daß der Lehrer die Referenzen als BESSER als Zeiger betrachtet - was mir ja sehr verdächtig vorkommt - ohne Argumentation.

@Technician: Mach doch mal den Programmier-Lehrer-Test:

Frage nach dem Unterschied zwischen NOT und XOR -1. Mal schauen wie lange der fürs Ergebnis braucht. Braucht er länger als 30 Sekunden, dann ist er fachlich vermutlich eher eine Pfeife die wohl nur gerne vor den Schülern Sprüche klopft (um diesen zu zeigen wie blöd sie doch in Wirklichkeit sind) und gut aus den Büchern ablesen kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Crush

Wenn es keinen Unterschied gäbe wäre es ja nicht notwendig ein eigenes Zeichen mit eigener Bezeichnung für Referenzen und Zeiger zu definieren ... mal logisch betrachtet. Es geht ja nur ums Prinzip - und das ist bei beiden täuschen ähnlich ...

Jetzt verwirren wir die Technician allerdings noch vollkommen - der wird bestimmt ganz schwindlig wenn die das hier liest. Hoffentlich konnten wir ihr weiterhelfen und sie nicht noch konfuser machen als es ohnehin schon ist.

Ich bin nicht JETZT konfuser als VORHER, sondern BELEHRTER!

Ich bin noch nicht vom Bürostuhl runtergetorkelt und habe auch keine Abscheu gegen C++ entwickelt

:):D

Original geschrieben von Crush

Was mich ja auch etwas irritiert war die Aussage, daß der Lehrer die Referenzen als BESSER als Zeiger betrachtet - was mir ja sehr verdächtig vorkommt - ohne Argumentation.

Es ist nicht der LEHRER, der Referenzen als "besser" ansieht - der sagt, Pointer sind besser. Mein Mentor (hier in der Firma) hat gesagt, er hat im Studium immer alles mit Referenzen programmiert.

Original geschrieben von Crush

@Technician: Mach doch mal den Programmier-Lehrer-Test:

Frage nach dem Unterschied zwischen NOT und XOR -1. Mal schauen wie lange der fürs Ergebnis braucht. Braucht er länger als 30 Sekunden, dann ist er fachlich vermutlich eher eine Pfeife die wohl nur gerne vor den Schülern Sprüche klopft (um diesen zu zeigen wie blöd sie doch in Wirklichkeit sind) und gut aus den Büchern ablesen kann.

So würd ich den nicht einschätzen - obwohl deine Beschreibung wohl viele Lehrer (was man so von anderen Schulen hört) zutrifft.

Gruß,

Technician

P.S.: meinst du (XOR)^-1?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Technician

P.S.: meinst du (XOR)^-1?

Eben, die Frage enthaelt einen Widerspruch. Wenn einer darueber laenger als 30 Sekunden nachdenkt, spricht das eher fuer geistigen Tiefgang.

Und jetzt wieder zum Thema, dieser Auszug aus der C++ FAQ Lite sollte die offenen Fragen beantworten. Besondere Beachtung verdient der gross gedruckte Abschnitt!

[8.1] What is a reference?

An alias (an alternate name) for an object.

References are frequently used for pass-by-reference:



    void swap(int& i, int& j)

    {

      int tmp = i;

      i = j;

      j = tmp;

    }

    

    main()

    {

      int x, y;

      // ...

      swap(x,y);

    } 

Here i and j are aliases for main's x and y respectively. In other words, i is x — not a pointer to x, nor a copy of x, but x itself. Anything you do to i gets done to x, and vice versa.

OK. That's how you should think of references as a programmer. Now, at the risk of confusing you by giving you a different perspective, here's how references are implemented. Underneath it all, a reference i to object x is typically the machine address of the object x. But when the programmer says i++, the compiler generates code that increments x. In particular, the address bits that the compiler uses to find x are not changed. A C programmer will think of this as if you used the C style pass-by-pointer, with the syntactic variant of (1) moving the & from the caller into the callee, and (2) eliminating the *s. In other words, a C programmer will think of i as a macro for (*p), where p is a pointer to x (e.g., the compiler automatically dereferences the underlying pointer; i++ is changed to (*p)++; i = 7 is automatically changed to *p = 7).

Important note: Even though a reference is often implemented using an address in the underlying assembly language, please do not think of a reference as a funny looking pointer to an object. A reference is the object. It is not a pointer to the object, nor a copy of the object. It is the object.

[8.5] When should I use references, and when should I use pointers?

Use references when you can, and pointers when you have to.

References are usually preferred over pointers whenever you don't need "reseating". This usually means that references are most useful in a class's public interface. References typically appear on the skin of an object, and pointers on the inside.

The exception to the above is where a function's parameter or return value needs a "sentinel" reference. This is usually best done by returning/taking a pointer, and giving the NULL pointer this special significance (references should always alias objects, not a dereferenced NULL pointer).

Note: Old line C programmers sometimes don't like references since they provide reference semantics that isn't explicit in the caller's code. After some C++ experience, however, one quickly realizes this is a form of information hiding, which is an asset rather than a liability. E.g., programmers should write code in the language of the problem rather than the language of the machine.

Alles klar jetzt? ;)

Uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

(ganz kurz: Ich habe nie behauptet, daß mehrere Zeiger auf das gleiche Objekt nicht dasselbe Objekt sind - hättest Du also nicht so groß machen müssen für mich - hätt´ ich auch so geglaubt)

Mir schon - hab ja nie behauptet, daß Beides genau dasselbe ist - nur scheinbar, beinahe, fast ... oder auch überhaupt nicht - je nachdem wie es im Auge des Betrachters schimmert. Man muß ja auch nicht unbedingt wissen, wie die Einspritzung beim Auto funktioniert - Hauptsache das Auto bewegt sich vorwärts bei eingelegtem Gang mit Druck aufs Gaspedal!

Bei vielen Dingen (Mathematik, Physik, Programmieren, etc.) gibt es viele "Modelle". Manchmal ist das eine für denen einen einleuchtender als das andere - aber beide verstehen für sich wie der Hase läuft und können damit trotzdem in der Zukunft umgehen.

Die Welt und unser Wissen ist auch nur eine Reproduktion und Verknüpfung in unserem Gehirnhologramm welches mit Sicherheit bei jedem anders funktioniert - auch wenn beide scheinbar dasselbe tun und denken. Bei dem Wort rot denken zwar viele zuerst an "Hammer" aber andere halt an Blut, Feuer oder sonstwas - rot ist auch nicht unbedingt rot, weil die Sehnerven des einen schon ganz anders sind als die des nächsten Menschen. Was für einen rot ist ist für den nächsten eher in Wirklichkeit purpur und für andere glatt grün. Erst letzte Woche habe ich mir mit meiner Frau Wildlederklamotten im Schaufenster angesehen, da kam ein Pärchen an und die Frau meint: "Das würde mir doch prima stehen!" sagt er "Das ist doch grün - eklig!" Wir mußten erstmal versuchen ihn zu überzeugen, daß das wirklich braun ist und nix anderes ... Allerdings war er seiner Meinung nach nicht Farbenblind - es war halt Kunstlicht im dunkeln - sonst nix - und er hat alles anders gesehen als andere (hehe).

Wenn man die Dinge so betrachtet kann man sich über alles streiten und würde nie auf einen grünen Zweig kommen. Der Mensch muß immer für sich Informationen sammeln und versuchen aufgrund seines Erfahrungsschatzes (der leider nicht bei jedem allzu reichhaltig ist) eine Vision der Realität zu erhalten, sodaß er in der Lage ist damit zu leben oder besser noch umzugehen (oder sie zukünftig zu ignorieren).

Technician - dieses Thema könnten wir ja fast schon bei dem Lichtgeschwindigkeits-Thread breittreten und durchkauen bis zum geht nicht mehr =;-)

Uli, verstehe mich nicht falsch - ich zweifle grundsätzlich mal nix von niemanden einfach so an - von Dir schon zweimal nicht, weil ich Dich für unheimlich gut halte. Also faß das bloß nicht als Kritik auf - nur als die Auffassung eines anderen, der wohl ein anderes Bild hat als Du, aber bisher damit leben konnte. Das bedeutet nicht, daß ich Deine Worte nicht wohlbeherzt aufnehme und versuche mit meinem Bild zu einem Neuen, Farbenfroherem zu verquirlen.

Auf daß unsere Gehirne vor Wissen nicht überschäumen ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Crush

(ganz kurz: Ich habe nie behauptet, daß mehrere Zeiger auf das gleiche Objekt nicht dasselbe Objekt sind - hättest Du also nicht so groß machen müssen für mich - hätt´ ich auch so geglaubt)

Und für mich auch nicht ;)

"REFERENZEN WERDEN ALS SYNONYME VERWENDET" steht auch ganz dick auf dem Skript! :D

Original geschrieben von Crush

Technician - dieses Thema könnten wir ja fast schon bei dem Lichtgeschwindigkeits-Thread breittreten und durchkauen bis zum geht nicht mehr =;-)

Uuuuups :D

Original geschrieben von Crush

Uli, verstehe mich nicht falsch - ich zweifle grundsätzlich mal nix von niemanden einfach so an - von Dir schon zweimal nicht, weil ich Dich für unheimlich gut halte.

Uli wird nicht nur für gut gehalten -> er ist es einfach! :)

Original geschrieben von Crush

Auf daß unsere Gehirne vor Wissen nicht überschäumen ...

Da ist es doch wieder gut, dass wir keine Computer-Gehirne haben (obwohl man unsereins manchmal nachsagt, wir hätten welche)- so ein Computerhirn wäre doch schlimm, wenn das voll werden könnte oder man sich überlegen müsste "Reicht mein Geld für die nächste Speichererweiterung, damit ich dies und das noch lesen/lernen kann? :eek: " :D :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Crush

Schon gut, fuehlte mich nicht kritisiert oder angegriffen. Danke fuers Kompliment.

Referenzen sind nur einfach etwas Hochsprachliches. Es fuehrt in die Irre, das auf Assemblerebene oder mit Adressen oder Pointern vergleichen, verstehen oder erklaeren zu wollen.

Die ganzen Debatten sind hundertfach von viel erfahreneren Leuten international gefuehrt worden, und in der FAQ steht die Essenz daraus. Eine groessere Autoritaet gibt es fuer mich in Sachen C++ auf dieser Welt nicht, und ich bin bisher immer gut gefahren, wenn ich einen eigenen, aber dazu in Widerspruch stehenden Erklaerungsansatz ganz schnell verworfen habe.

Uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...