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



  • Danke für die Tipps.

    Ich möchte C++ lernen da ich es für das beste Werkzeug für mein Vorhaben halte. Die Demoszene hat es mir schon seit dem C64 angetan und nun möchte ich so etwas auch auf dem PC selbst programmieren. Also sind das Themen wie Echtzeitgrafik und Software Synthesizer die mich interessieren. Auch möchte ich nicht viele Libs nutzen, sondern das alles selbst programmieren, weil mich die Themen an sich auch interessieren. Also wird es neben Versuchen in OpenGL auch einen Software Renderer geben oder einen kleinen Raytracer. Wie viele Jahre es dauert bis ich die Themen zusammen mit C++ drauf habe ist egal. Ich habe jede Menge Zeit.

    Da das alles nur ein Hobby ist, brauche ich mich nicht um alte Standards kümmern. Also werde ich mich auf C++11 bis C++17 konzentrieren.



  • Ein Buch holen und von A bis Z durchackern?

    Jo. Solange auf dem Buch nicht "von A bis Z" steht.

    C++ vielleicht anhand einen Projektes lernen, wo man am Anfang nur wenig der C++ Mittel einsetzt und dann immer mehr durch komplexeres Sprachmittel ersetzt?

    Ja. Code lesen hilft.

    Tuts oder YouTube anschauen?

    Nein. Solche Tutorials sind meistens sehr schlecht und die Videos dauern zu lang. Lies ein Buch.

    Welchen Standard sollte man als Anfänger lernen: C++98, C++11, C++14, C++17

    Ich würde dir raten dich zwischen C++03 und C++11 zu bewegen. Erstmal. Weißt, nach C++03 ist schon ein Haufen hinzugekommen. Du solltest dich erstmal mit der Sprache selbst befassen und höhere/neuere Konstrukte erstmal außen vor lassen. Lerne halt erstmal Grundmittel und befass dich nachher damit, was seit C++11 bis C++17 alles neu hinzugekommen ist. Natürlich kannst du aber auch sofort mit einem C++17-fähigen Compiler arbeiten, was ich dir auch anrate. Auch die Wahl des Compilers sollte sorgfältig gewählt werden. Hierzu schlage ich dir einer der drei Giganten vor, g++, clang oder msvc.

    [...] Auch möchte ich nicht viele Libs nutzen, sondern das alles selbst programmieren,[...]

    Behalte im Kopf dass solche Libs wie Boost und Co. dir jede Menge Arbeit abnehmen und die Leute extra für dich schon Musterlösungen gebaut haben, die du nur noch in dein Projekt einbinden musst und losprogrammieren kannst. Das ganze selbst zu programmieren, tja, kannst du aus Lernzwecken machen, aber bei Projekten, die ernst zu nehmen sind, rate ich dir dann trotzdem die (beispielsweise) Boost-Lösung zu nehmen. Aber andererseits hat auch dieses Vorhaben seinen Lerneffekt, also nur zu.

    [..]in OpenGL[...]

    ➡ ⚠ OpenGL ist C. Wenn du OpenGL in C++ nutzen willst, dann machs anständig. Entwickle neue Klassen, die dir die lästige C-Arbeit in irgendeiner Art und Weise abnehmen. OpenGL + C++, das macht C+-. C+- ist mit den ganzen Libs heutzutage vermeidbar und man sollte das den Menschen überlassen, die schon alles verstanden haben.

    Wie viele Jahre es dauert bis ich die Themen zusammen mit C++ drauf habe ist egal. Ich habe jede Menge Zeit.

    Da das alles nur ein Hobby ist, brauche ich mich nicht um alte Standards kümmern. Also werde ich mich auf C++11 bis C++17 konzentrieren.

    Na dann mal los.
    Viel Spaß.



  • Danke für deine Antwort.

    Auf dieser Microsoftseite: https://docs.microsoft.com/en-us/cpp/cpp/welcome-back-to-cpp-modern-cpp habe ich ein Vergleich von altem zu modernem C++ gefunden. Das neue C++ sieht ja schon wesentlich übersichtlicher aus. Das alte C++ kommt sehr kryptisch rüber:

    altes C++

    // circle and shape are user-defined types  
    circle* p = new circle( 42 );   
    vector<shape*> v = load_shapes();  
    
    for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) {  
        if( *i && **i == *p )  
            cout << **i << " is a match\n";  
    }  
    
    for( vector<circle*>::iterator i = v.begin();  
            i != v.end(); ++i ) {  
        delete *i; // not exception safe  
    }  
    
    delete p;
    

    modernes C++

    #include <memory>  
    #include <vector>  
    // ...  
    // circle and shape are user-defined types  
    auto p = make_shared<circle>( 42 );  
    vector<shared_ptr<shape>> v = load_shapes();  
    
    for( auto& s : v ) {  
        if( s && *s == *p )  
            cout << *s << " is a match\n";  
    }
    


  • Starglider schrieb:

    https://docs.microsoft.com/en-us/cpp/cpp/welcome-back-to-cpp-modern-cpp habe ich ein Vergleich von altem zu modernem C++ gefunden.

    Ich wollte nur einwerfen, dass beide Snippets furchtbar und nicht repräsentativ sind. Im Snippet "altes C++" sollte p ein boost::scoped_ptr sein (oder direkt ein circle ohne dynamische Allokation) und v ein boost::ptr_vector . Danach nutzt er in Zeile 5 plötzlich einen inkompatiblen Iterator-Typ, was so gar nicht kompiliert.
    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.



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


Anmelden zum Antworten