new Operator in einer Methode
-
nightrider schrieb:
Wozu überhaupt erst Dreck machen? In C++ muss, im Gegensatz zu Java, nicht alles auf den Heap. Genaugenommen ist das sogar eher die Ausnahme.
Also wenn möglich sollte ich alles was geht auf den Stack legen oder? Den Stack zu pushen und zu poppen wird schließlich schneller sein, als Speicher am Heap zu de/allokieren oder?
Der Hauptvorteil des Stack ist weniger die Geschwindigkeit, sondern die Sicherheit. Stack-Objekte werden automatisch vernichtet, wenn sie nicht mehr gebraucht werden (egal auf welchem Weg ihr Scope verlassen wurde), Heap-Objekte werden erst zerstört, wenn du explizit delete aufrufst (und wenn du keinen Verweis mehr darauf hast, geht das nicht mehr).
Mit den Sprachelementen von C++ kenne ich mich recht gut aus. Ich weiß aber nicht, wie ich manche Sprachelemente einsetzen soll/muss. Z.B. finde ich das Schlüsselwort typedef recht überflüssig. Warum einem Typen nochmal einen neuen Namen geben? Oder beim Schlüsselwort union kann ich mir nicht vorstellen, dass das in der Praxis gebraucht wird. Oder warum gibt es structs wenn es Klassen gibt?
Erstens hat C++ alle drei Schlüsselwörter aus C geerbt. Zweitens:
* typedef: Die Namen von Datentypen können durchaus etwas umfangreicher werden, da ist es gut, eine Abkürzung dafür definieren zu dürfen. Außerdem ist es praktischer für die Austauschbarkeit, daß z.B. jede Containerklasse die wichtigsten Typen als typedef mitliefert.
* struct: Ist syntaktisch fast äquivalent zu class, aber wird normalerweise verwendet, um einen Unterschied zwischen "echten" Klassen (Datenmember sind privat, Kontakt nach außen erfolgt über öffentliche Methoden) und Wertesammlungen (öffentlich zugängliche Datenmember, eventuell ergänzt um ein paar Hilfsmethoden) zu kennzeichnen
* union: Ist im C++ Umfeld tatsächlich selten (vor allem, weil es sich nicht mit non-POD-Typen verträgt).Oder die noch bessere Frage: Wie habt ihr so gut C++ gelernt??

VIEL Übung und gutes Lehrmaterial.
-
Danke für die super Erklärungen!
-
Jetzt habe ich noch eine kurze Frage. Ich wollte keinen neuen Thread deswegen aufmachen:
class A { public: A(int x) { } }; class B { public: A a(34); };Warum kann ich so kein Objekt von A in B erzeugen??
-
Das kannst du schon, geht aber so:
struct A { A(int); }; struct B { A Var; B(); }; B::B() : Var(123) { }
-
Coole Sache, ich wäre mir sicher gewesen, dass das nur mit new funktionieren würde. Das hat mir echt den Tag gerettet

Danke sehr.