Zugriffsoperator und Auswahlsoperator
-
Hallo zusammen,
ich habe soeben den Unterschied zwischen dem Zugriffsoperator und dem Auswahlsoperator kennen gelernt. Doch bin ich ein bisschen verwirrt, da mir nicht ganz klar ist, wann ich nun was nutzen soll. Bis jetzt habe ich eine Klasse immer so vereinbart:class TExample { public: void __fastcall Method (void); __fastcall TExample (); } .... TExample *Example1 .... Example1 = new TExample (); // Methoden rufe ich normalerweise dann so auf: void __fastcall TForm1::Button1Click (TObject *Sender) { Example1->Method (); //Zugriffsoperator }
Meine erste Frage ist: Ich habe hier ja kein Objekt vereinbart, sondern nun den Zeiger, der Example1 heißt. Was bedeutet das genau und was ist der Untschied zu einem Objekt? Nun habe ich gelernt:
class TExample { public: void __fastcall Method (void); __fastcall TXxample (); } .... TExample Example1 .... void __fastcall TForm1::Button1Click (TObject *Sender) { Example1.Method (); //Auswahlsoperator }
Nun habe ich ein ganzes Objekt vereinbart. Daher muss ich den Auswahlsoperator verwenden, um eine Methode aufzurufen. Meine zweite Frage ist, wann verwende ich was? Ist es völlig egal, ob ich die erste oder die zweite Möglichkeit anwende oder gibt es Vor- bzw. Nachteile?
Vielen Dank für eure Hilfe
lg, freakC++
-
Du könntest mal nach c++ stack vs heap googlen.
Vllt hier, erklärt aber nur den allerersten Anfang:
http://tutorial.schornboeck.net/stack_heap.htm
-
freakC++ schrieb:
Meine zweite Frage ist, wann verwende ich was? Ist es völlig egal, ob ich die erste oder die zweite Möglichkeit anwende oder gibt es Vor- bzw. Nachteile?
Die erste Variante ist anfällig für Speicherlecks (du könntest das Freigeben des Objektes vergessen, oder eine Exception könnte den Programmablauf unterbrechen), die zweite nicht (Stackobjekte werden beim Verlassen des Scopes automatisch freigegeben, auch beim Auslösen einer Exception).
Es gibt allerdings Umstände, die dich zwingen, Objekte auf dem Heap anzulegen. Beispielsweise kannst du in C++Builder von TObject abgeleitete Klassen nicht auf dem Stack allozieren. Die Gründe dafür habe ich hier erläutert (auch, wie man sich in diesem Fall vor Speicherlecks schützt).
-
@freakC++
HiermitExample1 = new TExample ();
hast du dein Objekt erzeugt und den Zeiger darauf Example1 zugewiesen. Die Klammern hinter TExample sind eigentlich nicht nötig.