Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Referenzen und Objekte

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]
000
10.01.2004, 15:59 Uhr
~Christoph Redl
Gast


Hallo!


1) Angenommen ich schreibe Folgendes:

Klasse1 objekt;

Kann man dann sagen, dass "objekt" eine Referenz auf eine Instanz der Klasse "Klasse1" ist?
Nach dem was man so liest (also dass man z.B. Referenzen auch für Basistypen einsetzen kann) schaut es ja nicht so aus, aber ich bin mir da trotzdem noch unsicher, wenn ich mir andere Programmiersprachen ansehe:

In Java oder VB z.B. sind alle Dinge (um den Begriff neutral zu halten) mit denen man auf Objekte zugreifen kann Referenzen:

Java: JavaClass javaObject = new JavaClass();
VB: Dim vbObject as new VBClass()

In diesem Fall wären javaObject und vbObject Referenzen auf Klasseninstanzen, also Referenzen auf Objekte.

Ist das nun in C++ auch so, dass alles das auf Objekte "zeigt" eine Referenz ist? Wenn nein: Was ist es dann, also wie würde man in Klasse1 object; das object nennen?

Wenn es Referenzen sind, dann wäre ja in folgendem Beispiel:

Klasse1* object = new Klasse1();

"object" eigentlich ein Pointer auf eine Referenz, oder?



2) Den technischen Unterschied zwischen Pointern und Referenzen verstehe ich ja, aber was genau ist der Unterschied für den Programmierer? Abgesehen von der Syntax kann man doch mit beiden Dingen das gleiche machen, oder?


3) Warum kann man in C++ nicht schreiben: Klasse1 object(); ?
Da meckert er bei den Klammern. Aber was ist wenn ich nicht den Standard-Konstruktor verwenden will? Dann muss ich ihm doch Parameter in den Klammer übergeben? Warum geht es nur wenn ich schreibe: Klasse1* object = new Klasse1(); ?


Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.01.2004, 17:03 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zu 1)

Zitat:

Klasse1* object = new Klasse1();
"object" eigentlich ein Pointer auf eine Referenz, oder?


Ich würde sagen nein... object ist einfach nur ein pointer...



zu 2)
der unterschied für den programmierer ist das er sich 1. schreibarbeit spart weil er nicht immer dereferenzieren muss und zweitens ist das von denken her auch einfacher (ist irgendwie intuitiver, der quellcode liest sich dann auch besser) wenn man z.b. ein array übergibt das neue allokiert wird muss man bei nem 1d-array schon ein doppelpointer mit übergeben bzw. wenn der wert einer variable geändert werden muss muss man die adresse übergeben

mein lieblingsbeispiel dazu

C++:
int x=3;y=5;

void swap(int x,int y){int help=x;x=y;y=help;}
//wen du es so machst wird zwar getauscht aber wenn die funktion am ende durch ist steht in x immer noch 3 und in y dir 5 weil nur mit kopien von x und y gearbeitet worden ist die am ende der funktion wieder gelöscht werden.

void swap(int *x, int *y){int help=*x;*x=*y;*y=help;}
//hierbei steht auch nach dem durchlaufen der funktion in x die 5 und in y die 3 weil nicht die variablen selber sondern die pointer kopiert wurden

void swap(int &x, int &y){int help=x;x=y;y=help;}
//ist ähnlich wie bei den pointer nur das du dir das dämliche dereferenzieren ersparst. es wird nicht mit kopien der variable selbst gearbeitet sondern direkt mit den addressen obwohl du die variablen ansprichst als wären sie keine adressen



zu 3)
wenn ich mal da das zweite mit dem dritten vergleiche ziehe ich klar die referenz gegenüber dem pointer vor....

Klasse1 object(); könnte eine funktionsdeklaration sein...
um mehrdeutigkeiten zu vermeiden wird deshalb der defaultkonstruktor ohne klammern aufgerufen
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 10.01.2004 um 17:06 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.01.2004, 17:06 Uhr
(un)wissender
Niveauwart



Zitat:

[...]"object" eigentlich ein Pointer auf eine Referenz, oder?


Pointer auf ein Objekt ist richtig, Referenz ist eigentlich nichts anderes als ein Pointer, nur mit einigen extra Bedingungen. Bspw. ist das, was in Java immer als Referenz angepriesen wird, eigentlich nur ein Pointer.


Zitat:

2) Den technischen Unterschied zwischen Pointern und Referenzen verstehe ich ja, aber was genau ist der Unterschied für den Programmierer? Abgesehen von der Syntax kann man doch mit beiden Dingen das gleiche machen, oder?


Prinzipiell richtig, nur das Referenz per Definition nicht null sein dürfen(aber leider sein können, wenn der Programmierer nur genug Mist baut) und du etwas anders auf ihre Member zugreifst (. statt ->).
Außerdem ist ein Pointer mit dem Typ einer abstrakten Klasse legal (weil null erlaubt ist), eine Referenz darauf nicht!


Zitat:

Klasse1 object(); ?


So ist es richtig: Klasse1 object;, bei keinem Parameter und einem benannten Objekt werden die Klammern weggelassen.
Was du da oben machst, ist die Deklaration einer Methode ohne Parameter mit dem Rückgabewert Klasse1.
Dieses Prinzip ist von C übergeblieben und ist eigentlich für C++ nur noch Scheiße, aber C-Kompatiblität muss halt gewährleistet werden.


Bearbeitung:

@Windalf
Mist, warst schneller!
-----
Fehlerkorrektur


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 10.01.2004 um 17:10 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.01.2004, 17:08 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@(un)wissender
erster erster erster
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.01.2004, 17:13 Uhr
(un)wissender
Niveauwart





--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.01.2004, 17:14 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:




mich
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.01.2004, 17:15 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
~Christoph Redl postete
Hallo!


1) Angenommen ich schreibe Folgendes:

Klasse1 objekt;

Kann man dann sagen, dass "objekt" eine Referenz auf eine Instanz der Klasse "Klasse1" ist?





Nein. Das ist eine Instanz,


C++:
Klasse1 object;
Klasse1& reference = object;
Klasse1* pointer = &object;
...


Im Unterschied zu Java, wo objekte eigentlich nur über ihre Referenzen ansprechbar sind, kann man in C++ Objekte direkt ansprechen.



Zitat:
~Christoph Redl postete
2) Den technischen Unterschied zwischen Pointern und Referenzen verstehe ich ja, aber was genau ist der Unterschied für den Programmierer? Abgesehen von der Syntax kann man doch mit beiden Dingen das gleiche machen, oder?



Technisch gesehen werden pointer und Referenzen wohl meist gleich implementiert - eben als Zeiger. Syntaktisch werden sie anders umgesetzt und von der Swmantik her sind sie ebenfalls unterschiedlich:
Ein Pointer ist ein Zeiger auf einen Speicherbereich, eine Referenz ein Aliasname für eine Instanz. Man kann also mit einer Referenz genauso umgehen, wie mit einem Originalobjekt, bei einem Pointer muß man aber immer dereferenzieren:

C++:
object.method();
reference.method();
pointer->method();


Technisch mag das zwar immer gleich umgesetzt werden, aber von der Schreibweise her ists ein Unterschied.
Es gibt aber auch weitere UNterschiede:

1. Eine Referenz muß zum Zeitpunkt ihrer Definition initialisiert werden, dh man muß gleich zu Anfang sagen, für welches Objekt die Referenz ein Aliasnamen darstellt. Diese Zuordnung kann niemals Später geändert werden. Einen Pointer kann man immer irgendwohin anders zeigen lassen.

2. Ein Pointer kann explizit nach NULL zeigen, eine Referenz eigentlich niemals.

Es gibt noch weitere, aber nicht ganz so wesentliche Dinge.



Zitat:
~Christoph Redl postete
3) Warum kann man in C++ nicht schreiben: Klasse1 object(); ?
Da meckert er bei den Klammern. Aber was ist wenn ich nicht den Standard-Konstruktor verwenden will? Dann muss ich ihm doch Parameter in den Klammer übergeben? Warum geht es nur wenn ich schreibe: Klasse1* object = new Klasse1(); ?


Weil die erste Form als Funktionsdekalration angesehen wird. Der Compiler glaubt, du willst ihm mitteilen es gäbe eine Funktion names object, die eine Klasse1 als Rückgabewert und keinen parameter hat. Laß die Klammern einfach fort - auch beim new.
Beim new gibt es nicht das Problem, daß der Compiler es verwechseln könnte mit einer Deklaration, daher geht es auh mit den Klammern.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 10.01.2004 um 17:15 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.01.2004, 17:19 Uhr
(un)wissender
Niveauwart


@virtual ist letzter
Aber immerhin mit der besten Erklärung.
Ich denke, nun weiß @Christoph Redl echt Bescheid.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.01.2004, 17:20 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hmm da ja mal wieder drei leute die selbe frage beantwortet haben schlage ich folgendes addon als forum for....

wann immer man einen Thread beantworten will hat man die möglichkeit auf was zu klicken...
die anderen user sehen (da steht dann von mit aus dieser Thread wird gerade von virtual bearbeitet...) dann das schon jemand diesen thread gerade bearbeitet und können (müssen natürlich nciht) so lange warten bis der fertig ist... wenn die antwort nicht vollständig ist.... kann man ja immer noch was hinzufügen....

@all
wie findet ihr die Idee? Bullshit oder io...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.01.2004, 17:26 Uhr
virtual
Sexiest Bit alive
(Operator)


Bin ich gegen. Könnte ja sein, daß ich während der beantwortung nen Herzkasper bekomme und dann denken alle: der virtual wird die frage schon benatworten und der Fragesteller wird niemals eine Antwort auf die Frage bekommen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 10.01.2004 um 17:26 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: