C++ Anfänger Fragen



  • Hallo Leute, bin neu im Forum und C++ Einsteiger. Habe bislang nur Java eingehender programmiert.

    Habe in den letzten Wochen C++ Primer von Patra durchgarbeitet und wollte jetzt mal in das Primer Buch von Lippman reinschauen. Allerdings ist die EBook Version, wie auch auf Amazon in den Kommentaren bemerkt wird, kaputt.

    Hat jemand da vielleicht ne vernünftig gesetzte Version als PDF zur Hand?

    Zuvor habe ich allerdings ein paar Verständnisfragen, die mir beim Durcharbeiten des Buches gekommen sind und die ihr mir, wie ich hoffe, beantworten könnt.

    1. Eine Frage zu Move Constructors und Move Assignment Operators:

    Sehe ich das richtig, dass diese ähnlich wie Copy Constructor und Assignment Operator nur im Falle von Heap Speicher Allokation in der jeweiligen Klasse wichtig werden?

    Wenn ich das korrekt verstanden habe, dient die Move Semantic dazu bei rvalue Referenzen, wie zB bei Funktion return values in Form von temporären Objekten den Zugriff von bereits allokiertem Heap Speicher zu übertragen, und dem vorherigen Zugreifenden den Zugriff zu verwehren?

    2. Warum werden oftmals in der private Sektion einer Klassendeklaration pointer auf Objekte angelegt, die dann nach Constructor aufruf auf Heap Speicher verweisen? Macht das nicht nur Sinn, wenn erst zur Laufzeit klar ist, wie groß der benötigte Speicher ist? Also bei array-Größen?

    Warum deklariert man nicht stattdessen direkt eine Instanz des Objektes? Ist der Speicherzugriff auf dem HEAP vielleicht schneller?

    3. Was für einen Unterschied macht es, ein Objekt aufem Stack oder auf dem Heap anzulegen?

    Vector<int> vec;    oder
    shared_ptr<Vector<int>> pvec(new Vector<int>);
    

    4. warum seh ih häufig, dass std::cout geschrieben wird, anstatt einmal oben den namespace zu definieren?

    Danke schon mal



  • 1. Ja Move Constructor/Assignment Operator macht nur Sinn wenn man Speicher auf dem Heap hat oder wenn man Move Only Typen haben möchte ( unique_ptr ).

    2. Nein Heap Speicher ist nicht schneller und kostet bei der Reservierung überlicherweise auch mehr Zeit als einfach eine Variable auf dem Stack zu erstellen. Keine Ahnung warum der von dir gefundene Code das macht. Eigentlich sollte man es nur für dynamisch große Arrays oder kompliziertere Datenstrukturen wie linked Lists, Bäume, etc. nutzen.

    3. Hier kostet der shared_ptr zusätzlichen Speicher und bringt zusätzliche Funktionen wie Referenz Zähler mit. Es kann sinnvoll sein einen shared_ptr auf einen Vector zu haben, in 99% der Fälle ist einfach eine Variable auf dem Stack besser.

    4. Ein globales using namespace std; in einer Headerdatei ist schlechter Stil weil dann Benutzer dieser Headerdatei den gesamten std Namespace kriegen und das eventuell gar nicht wollen. In *.cpp Dateien kann man aber schon ein using namespace machen, oder auch innerhalb von Funktionen in der Headerdatei.


Anmelden zum Antworten