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. |