Wie fange ich am besten an C++ zu lernen?



  • auch nicht verkehrt wäre, erstmal C zu lernen. Da der Betreffende schon Assembler kann, dürfte das sehr schnell gehen, weil man in Assembler natürlich viele Konzepte wie Zeiger, Stack, statische und dynamische Allokation schon kennt.

    Danach eine reine OOP-Sprache wie z.B. Smalltalk, um sich mit den Prinzipien der OOP vertraut zu machen - die sind ja in C++ etwas mit syntaktischen Einzelheiten verdeckt.

    Und dann C++.

    Lernkurve ist dann vielleicht länger, aber nicht so steil. Der Fragesteller hat nach eigener Angabe ja jede Menge Zeit.



  • Als Anfänger habe ich leider keine Chance solche Fehler in Codesnippes zu erkennen, aber danke für die Aufklärung.



  • Drei Sprachen lernen anstattt einer? Puh ganz schön hart. Ja mit Zeigern etc. habe ich keinerlei Probleme, außer mit der Syntax in C wo ein '*' mal das und mal dies bedeutet. C habe ich auch mal kurz versucht, von daher wollte ich mir das sparen. Smalltalk hmm, das kenne ich gar nicht.


  • Mod

    Fytch schrieb:

    Auch das Snippet "modernes C++" ist falsch, zumindest stilistisch. Einerseits sollten das alles unique_ptr s sein, andererseits gibt es keinen Anlass, in Zeile 8 eine non- const Ref zu benutzen.

    Sehe ich anders. Dynamische Allokation für circle ist völlig überflüssig, und der genaue Aufbau von shapes unwesentlich für den Algorithmus: dafür haben wir auto. Ich sehe auch nicht, inwiefern const in der Schleife irgendetwas verbessert. Ja, es gibt da diese Schule, die der Ansicht ist, const müsste überall hin, wo es nur geht. Das ist aber nur eine Möglichkeit und hat auch nichts direkt mit Modernität zu tun. Abgesehen davon sollten dann konsequenterweise auch p und v const sein.

    #include <memory>  
    #include <vector>  
    // ...  
    // circle and shape are user-defined types  
    circle c( 42 );
    auto shapes = load_shapes();  
    
    for( auto& shape_ptr : shapes ) { // _ptr im Namen, weil sonst nicht klar wird, was shape_ptr && machen soll
        if( shape_ptr && *shape_ptr == c )
            cout << *s << " is a match\n";  
    }
    

    Ob hier die Überladung von Operatoren tatsächlich angesagt ist, halte ich für etwas zweifelhaft, aber das is ein Designproblem von shape, und hat mit dem Codeschnipsel nicht direkt etwas zu tun.



  • camper schrieb:

    Dynamische Allokation für circle ist völlig überflüssig,

    Ich stimme dir zu und habe dasselbe beim ersten Snippet ebenfalls bemängelt.

    camper schrieb:

    Ich sehe auch nicht, inwiefern const in der Schleife irgendetwas verbessert.

    Andererseits sehe ich nicht, was die non- const -ness verbessert. Mit auto& lässt sich die Schleife nicht in eine Funktion auslagern, mit auto const& oder auto&& hingegen schon.



  • Die Frage wäre auch, ob solche Datentypengeschichten nicht sowieso in Haskell viel besser gehen, weil darauf optimiert.

    @Starglider
    Der Lernweg..das kommt ein wenig darauf an, wenn man sowieso viel mit Internetschnippseln zu tun hat, ist z.B. das Buch vom Breymann sehr nützlich, weil gute Nachschlagebasis und generell gutes Tempo.
    Den teilweise fehlenden roten Faden kann man mit C++ Tour von Stroustrup und/oder Volkards Tutorial ergänzen.

    Dieser Rote Faden, bzw. die Übersicht ist sehr wichtig. Tipp: Schreibe dir die "Eckpunkte" aus den genannten Quellen auf ein Plakat, so siehst du schnell, was du noch brauchst oder öfter wiederholen musst um nicht gleich wieder zu vergessen.

    Außerdem besorge dir einen Satz ausgewählter Sourcecodes, und markiere die Stellen, die du nicht oder am wenigsten verstehst.

    Eine Beispielquelle, die ihren Zweck erfüllt, wäre z.B.:
    https://github.com/dkedyk/CommodityADS2014Code
    Außerdem kann man sich ein paar Forendiskussionen aus dem c++ Forum herauspicken, die den gleichen Zweck erfüllen.

    Einen Schritt weiter gehen die Magazinartikel, z.B. der (Leih-)Artikel zum Thema Permutation von Starshaper https://www.c-plusplus.net/forum/178286

    Damit die Sprache nicht so allein ist braucht es noch so etwas wie
    https://www.heise.de/ct/projekte/machmit/asteroids/wiki/BeginnersGettingStarted

    und ein für Grafik hilfreiches Buch z.B. über Lineare Algebra - Du wirst das Buch eventuell als Teddybärlektüre brauchen, deswegen nicht irgendeinen Text nehmen.


  • Mod

    Fytch schrieb:

    camper schrieb:

    Ich sehe auch nicht, inwiefern const in der Schleife irgendetwas verbessert.

    Andererseits sehe ich nicht, was die non- const -ness verbessert. Mit auto& lässt sich die Schleife nicht in eine Funktion auslagern, mit auto const& oder auto&& hingegen schon.

    Nun ja, du bist derjenige, der meint, da sollte const hin. Dann musst du auch zeigen, wieso diese Variante besser sein soll. Ich stehe bloß auf dem Standpunkt, dass beide Varianten gleichwertig sind (wobei es ohne const nat. kürzer ist, was einen gewissen eigenen Wert hat). Ich würde es nicht weiter kommentieren, falls const dort schon vorher gestanden hätte.



  • @nachtfeuer
    Vielen Dank für die ausführliche Anleitung zum Start. Ich werde mir die Bücher besorgen und so wie du es beschrieben hast anfangen.



  • Das gleiche auch bei mir. Ich bin jetzt seit ca. 1 Woche dran, C++ zu lernen (hab davor rund 10 Jahre PHP+MySQL gebaut, zum Schluss mit abstrakten Klassen usw.)

    Dank eines Videos auf YT habe ich inzwischen einiges gelernt, was Gui-Programmierung angeht.

    Im Moment kämpfe ich damit, eine Art Layer über den Desktop zu legen, welchen ich für ein Programm brauche, das ich gerade "schreibe"



  • Hey super zwei Einsteiger mit Webbackground. Dann viel Spaß bei der wohl anspruchsvollsten Sprache die ich bis jetzt gesehen habe.

    Was holten die Profis hier von dem Buch "Schrödinger lernt C++(jetzt auch mit C++14)" Das wirkt nicht ganz so trocken.


  • Mod

    camper schrieb:

    Ja, es gibt da diese Schule, die der Ansicht ist, const müsste überall hin, wo es nur geht. Das ist aber nur eine Möglichkeit und hat auch nichts direkt mit Modernität zu tun.

    Für C++ ist es womöglich zu spät, aber funktionale Sprachen profitieren von immutability, weil solche Programme besser nativ über mehrere Kerne skalieren. Wenn wir einen großen Sprung machen, könnte man sich einen C++ Compiler vorstellen, der Funktionsaufrufe von puren Funktionen einfach intern über mehrere Kerne verteilen kann. Das funktioniert dann womöglich auf der Basis einer gesunden Portion const , welches die Analyse stark vereinfacht/bzw. erst decidable macht. Und modern nenne ich das, weil die Berücksichtigung von multicore Skalierung quasi erst seit 2005 existiert, also eine halbe Ewigkeit nach dem Design von C++ und seinen Vorgängern.



  • Hallo Kollege!
    Ich stehe wie du am Anfang C++ zu lernen.
    Habe das Buch "C++ Der Einstieg" (Aktuell zu C++11) von Arnold Willemer gekauft.



  • Hallo cesar++ und willkommen im Club, das werden ja immer mehr.



  • Starglider schrieb:

    Hey super zwei Einsteiger mit Webbackground. Dann viel Spaß bei der wohl anspruchsvollsten Sprache die ich bis jetzt gesehen habe.

    Was holten die Profis hier von dem Buch "Schrödinger lernt C++(jetzt auch mit C++14)" Das wirkt nicht ganz so trocken.

    schau mal in rubrik bücher 😉
    https://www.c-plusplus.net/forum/309734

    deseiteren würde ich dir dieses buch empfehlen:
    "Der C++ Programmierer. C++ lernen - Professionell anwenden" von Ulrich Breymann
    (ist vll nicht "locker" geschrieben dafür fachlich super!)

    dieses buch ist ganz gut für anfänger und später kannst du es als nachschlagewerk verwenden :), mach ich zumindest so :).

    lg



  • Danke für den Buchtipp. "Der C++ Programmierer" scheint dann wohl das beste für mich zu sein. Im Moment schnupper ich ein wenig in Rust rein, aber C++ steht weiterhin auf dem Plan.



  • zufallswert schrieb:

    auch nicht verkehrt wäre, erstmal C zu lernen.

    Das ist eine der schlimmsten Empfehlungen! Ich dachte, deine Spezies wäre ausgestorben. Leider ist es nicht der Fall.

    Die meisten die zuerst C lernen, haben den Umstieg auf C++ noch schwerer, weil sie dann C with Classes programmieren, und das ist nicht C++! C++ braucht eine ganz eigene Denkweise, bei der man am besten C aus seinem Gehirn ausradiert. Das C++ zu C kompatibel ist, war damals (1980er Jahre) nötig um die alten C-Programme leichter in die neu entstandene Sprache C++ zu migrieren. Aber heute ist das für neue Projekte absolut unnötig! Da fängt man gleich mit C++ an.

    Alleine durch die angewendeten C-Kenntnisse hat C++ so einen schlechten Ruf.



  • Und noch besser wäre es, wenn der C++-Standard die alten C-Konstrukte als "deprecated" versehen würde bzw. die Compiler einen "strict C++"-Modus (natürlich als Standard-Option!) anbieten würden, wo so Sachen wie C-Casts, diverse Zeigeroperationen (z.B. auch "array to pointer decay"), Aufrufe von C-Library-Funktionen (wie malloc, free, scanf, printf, ...) nicht erlaubt wären.
    Denn dann könnte man auch Anfänger leichter dazu kriegen, gleich die sinnvollen C++-Konstrukte zu benutzen (und dann würde hoffentlich kein C++-Buchautor mehr auf die Idee kommen mit C-Arrays und Zeigern in den ersten Kapiteln anzufangen).

    PS: @arcoth, @camper: was denken das ISO-Kommitee bzw. die Compiler-Hersteller darüber?



  • @Th69: bin zwar nicht der angesprochene, aber der Weg, der meines Wissens gegangen wird, ist z.B. erst einmal Tools zu entwickeln, die diese Core Guidelines erkennen bzw. umsetzen.

    Und da muss ich schon wieder mal clang-tidy erwähnen.

    Hier jetzt zu deinen angesprochenen Punkten:
    http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-no-malloc.html
    http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-pro-type-cstyle-cast.html
    http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-pro-bounds-array-to-pointer-decay.html



  • Artchi schrieb:

    zufallswert schrieb:

    auch nicht verkehrt wäre, erstmal C zu lernen.

    Die meisten die zuerst C lernen, haben den Umstieg auf C++ noch schwerer, weil sie dann C with Classes programmieren, und das ist nicht C++!

    Deshalb war meine Empfehlung ja, die Grundkonzepte von C und eine reine OOP-Sprache zu lernen. Um C++ wirklich zu verstehen, kommt man sowieso nicht drum herum, die Grundkonzepte von C zu verstehen. Oder möchte man wirklich verstehen, was ein "smart pointer" ist, ohne zu wissen, was ein "pointer" ist?



  • Na, um zu verstehen was ein Pointer ist, muss man dann aber vorher Assembler lernen. Und um Assembler zu verstehen, sollte man vorher Maschinencode lernen. Und dann bitte auch gleich Lochkarten oder gleich eine CPU bitte selber designen, damit man weiß, warum es Pointer und Register gibt. Danke!

    Nein! Man kann mit Smartpointer arbeiten, ohne den Low-Level-Kram vorher zu kennen. Aus dem einfachen Grund, weil man dann nicht verleitet wird, rohe Pointer einzusetzen. Was man nicht kennt, kann man nicht missbräuchlich einsetzen.

    Man sollte lernen, das C++ eine Hochsprache ist, die versucht sehr viel zu abstrahieren und den Programmierer von der Maschine fernzuhalten, wo es möglich ist. Wenn man an ein Limit stößt, kann man sich immer noch mit Low-Level-Kram auseinander setzen. Die meisten Entwickler werden das aber nicht brauchen.

    Ich kenne genug "Spezialisten" die vorgeben C++ zu programmieren, aber dann z.B. Polymorphie vermeiden. Diese Spezies sollte ausgerottet werden oder sie soll sich bitte nicht C++-Spezialisten nennen. Das sind die, die noch in der C-Zeitschleife hängen geblieben sind und sich nicht lösen können.

    C sollte man, wenn dann nach C++-Praxis lernen. Um am eigenen Leib zu erfahren, das C-Wissen absolut nichts in einem C++-Projekt zu suchen hat, weil es aus der IT-Steinzeit kommt und nur schlechtes C++-Design/-Denken fördert.

    Wer C programmieren will, soll das dann bitte mit C machen und nicht C++ infiltrieren und die unschuldigen C++-Anfänger nicht mit falschen Informationen manipulieren.


Anmelden zum Antworten