Linkliste für Neulinge
-
Linkliste für C++-Neulinge
Mit gekennzeichnete Themen setzen solide Grundkenntnisse voraus.
Bücher
Für Anfänger ist das wichtigste ein gutes Buch, welches Sprachgrundlagen und Standardbibliothek verständlich und korrekt erklärt. Leider ist der deutschsprachige Markt für gute Computerfachliteratur sehr dünn besetzt. Wer kein Problem mit Englisch hat, sollte sich unbedingt folgende, umfangreiche Liste ansehen, die stets aktuell gehalten wird:
https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list/388282#388282
Einige der dort genannten Bücher sind auch auf Deutsch erschienen. Man sollte jedoch darauf achten, dass es sich auch wirklich um das gleiche Buch vom gleichen Autor handelt und nicht um einen Trittbrettfahrer mit ähnlichem Titel; und man sollte ein paar Rezensionen lesen, ob die Übersetzung etwas taugt.Eine leider etwas veraltete Liste für deutschsprachige Titel findet man hier:
C/C++ Forum :: C++ Lernen - passende Lektüre und richtiger Anfang
Aktualisierungen dieser Liste gibt es hier:
https://www.c-plusplus.net/forum/333039#2456058Wer nach einem kostenlosen Buchersatz sucht, ist mit dem Openbook "Thinking in C++" gut bedient:
http://mindview.net/Books/DownloadSitesReferenzen
Mit Referenz ist eine Dokumentation der C++-Standardbibliothek gemeint.
Die beiden bekanntesten und wahrscheinlich auch umfangreichsten Websites sind:Eine Referenz lässt sich nur effizient nutzen, wenn man bereits eine Vorstellung hat, wonach man sucht. Sie ersetzt kein Lehrbuch.
Magazin
Seit 2005 bringt c-plusplus.net das C++-Magazin heraus. Viele Stammgäste des Forums haben sich als gute Autoren darin verewigt:
Oft empfohlene Artikel sind unter anderem:
- Ein- und Ausgabe in C++ - IO-Streams
- Zufälle gibt's?! - Funktionen rund um rand, Random und den Zufall
- Stringverarbeitung in C++
- Speicherverwaltung in C++ (und C)
- Überladung von Operatoren in C++
- Aufbau der Standardlibrary - Teil 1: Container
- Aufbau der Standardlibrary - Teil 2: Iteratoren und Algorithmen
- Aufbau der Standardlibrary - Teil 3: Hilfsklassen und Erweiterungen
- Einführung in Design Patterns
- Einführung in die Programmierung mit Templates
FAQs
Viele Fragen wurden schon oft gestellt und noch öfter beantwortet:
- C/C++ Forum :: Die meist gestellten Fragen
- parashift.com/c++-faq - Not just How - also When and Why!
Tutorials
Tutorials ersetzen kein Buch, seien aber trotzdem erwähnt:
- cplusplus.com/doc/tutorial (download)
- c++.de - Tutorials und Ebooks - C++ (deutsch)
- c++.de - Tutorials und Ebooks - C++
- c++.de - Tutorials und Ebooks - Object Oriented Programming
- c++.de - Tutorials und Ebooks - STL
"Tutorials" auf YouTube sollten von Anfängern gänzlich gemieden werden!
C++11
C++11
istwar die neueste Fassung des C++-Standards, welche im August 2011 von der ISO verabschiedet wurde und C++03 ersetzt.Während das Verständnis einiger neuen Features wie z. B. Lambda-Ausdrücke, variadic templates und Multithreading samt tls solide Grundkenntnisse voraussetzt, sind andere bereits für Sprachneulinge interessant:
- C++11 - Artikel in der englischen Wikipedia samt Auflistung wichtiger Neuerungen
- ISO/IEC Document n3337 - im Grunde der Text des offiziellen Standards ISO/IEC 14882:2011 mit lediglich redaktionellen Änderungen
Um C++11 Code kompilieren zu können, braucht man einen C++11-kompatiblen Compiler. Die aktuellsten Versionen der gängigen Compiler unterstützen fast alle der mit C++11 eingeführten Features:
- GCC ab Version 4.3 (spärlich) bis Version 4.8.1 (vollständig)
- Clang ab Version 2.9; Vollständige Kompabilität ab Version 3.3 und höher. Eine Auflistung aller C++11-Features samt der Version ab welcher Clang diese unterstützt befindet sich hier.
- Visual C++ 12.0 (Teil von Visual Studio 2013 (Express)). Bessere C++11 Unterstützung bieten jedoch das Visual C++ Compiler November 2013 Community Technology Preview (CTP) bzw. die Visual Studio 14 CTPs.
C++14
C++14 ist die neueste Fassung des C++-Standards, welche im Dezember 2014 von der ISO verabschiedet wurde und C++11 ersetzt. Die Neuerungen sind jedoch bei weitem nicht so radikal wie beim Sprung von C++03 auf C++11:
- C++14 - Artikel in der englischen Wikipedia samt Auflistung wichtiger Neuerungen
- ISO/IEC Document n4296 - im Grunde der Text des offiziellen Standards ISO/IEC 14882:2014(E) mit lediglich redaktionellen Änderungen
Wie bei C++11 auch, braucht man einen kompatiblen Compiler, um C++14-Code übersetzen zu können. Die meisten Compiler beherrschen bereits eine mehr oder wenige große Untermenge der neuen Features, man muss sie aber in der Regel durch einen Compilerschalter aktivieren. Man kann normalerweise zu allen gängigen Compilern leicht Listen der unterstützten Features und der nötigen Compilerschalter finden, indem man einfach nach "C++14" und dem Namen des Compilers googelt.
Compiler und IDEs
- C/C++ Forum :: Liste kostenloser Compiler und IDEs
- C/C++ Forum :: FAQ - Compiler & IDEs
- C/C++ Forum :: Compiler- und IDE-Forum
Boost
Boost ist eine Sammlung vieler Bibliotheken, die unter C++-Programmierern breite Verwendung finden. Viele der sog. Boost-Libs wurden bereits in den C++-Standard integriert.
Wer Boost nicht selbst kompilieren möchte, kann auf nuwen.net eine MinGW Distribution (gcc) inklusive vorkompiliertem Boost beziehen.
Für Benutzer von Visual Studio 2010 und 2012 gibt es von unserem Forenmember Vertexwahn ein Tool Namens BlueGo, das Boost, Qt and OpenSceneGraph selbst herunterlädt und übersetzt.- boost.org - offizielle Website
- Getting Started on Unix Variants
- Getting Started on Windows
- Highscore-Tutorials (deutsch, teils veraltet)
GUI-Programmierung
Eine grafische Oberfläche ist ein wesentlicher Bestandteil vieler Desktopapplikationen.
- C/C++ Forum :: Wie kann ich eine Oberfläche programmieren (siehe Punkt 1)
- C/C++ Forum :: Alles zur GUI Programmierung in C und C++
Tutorial zu wxWidgets im C++-Magazin:
Artikel zu den MFC im C++-Magazin:
- Eine MFC-Anwendung unicodefähig machen
- Eine MFC-Anwendung mehrsprachfähig erstellen
- Zusammenhänge der Klassen einer SDI in der MFC
- Datenbankzugriff mit CRecordset (und CDatabase)
Verschiedene empfehlenswerte Seiten
- isocpp.org - News, Status & Discussion about Standard C++
- stroustrup.com - offizielle Seite von Bjarne Stroustrup, Erfinder von C++
- cdecl.org - Übersetzt selbst unverständlichste C (und C++) Variablendeklarationen in klares Englisch und zurück
Hilfe beim Posten
Bevor man eine Frage stellt:
- Da fast jedes Problem mit einer dermaßen verbreiteten Sprache wie C++ schon einmal dagewesen ist, findet man mit einer Fehlermeldung und eventuell ein paar Stichworten + "C++" auf Google fast zu jedem Thema Input.
- Sollten einem die richtigen Stichworte für Google nicht in den Sinn kommen, kann man immer noch die Suchfunktion des Forums versuchen.
- Oftmals ist auch ein Blick in die C++-FAQs hilfreich, denn viele Fragen wurden schon oft gestellt und noch öfter beantwortet.
Sollte die eigene Recherche nicht auf den grünen Zweig führen:
- C/C++ Forum :: Die meist gestellten Fragen
- C/C++ Forum :: Du brauchst Hilfe?
- C/C++ Forum :: Wie poste ich richtig Code?
- Wie man Fragen richtig stellt
~edit durch SeppJ, 18. April 2014: Kaputten Link repariert und nicht mehr aktuelle Bemerkung zu C++11 auf www.cplusplus.com entfernt.~
~edit durch Arcoth, 2. Juli 2014: Liste der Compiler im C++11-Abschnitt verfeinert. Bücher-Rubrik oben platziert.~
~edit durch Swordfish, 1. August 2014: Informationen zu Visual C++ aktualisiert.~
~edit durch SeppJ, 25. November 2015: Informationen zu C++14 hinzugefügt~
~edit durch SeppJ, 23. Mai 2017: Bücherliste so gut wie möglich aktualisiert.~
-
Hallo Swordfish,
Unter Bücher würde ich noch folgenden Verweis setzen:
The Definitive C++ Book Guide and ListIch finde, das ist einer der wichtigsten Links, wenn von guten C++-Büchern die Rede ist.
-
was ist den mit http://www.highscore.de/
wäre das auch nich was zu empfehlen?
-
zimmer schrieb:
was ist den mit http://www.highscore.de/
wäre das auch nich was zu empfehlen?Eher naja. Hat ein paar ziemlich dicke Hauer drin . Von den deutschsprachigen Tutorials eines der besseren, aber das heißt nicht viel.
-
http://www.umaterialien.de/ ist auch nicht schlecht
habe damit in der schule angefangen zu lernen
ist aber nicht nur für c++ auch andere dinge
-
...
-
Sorry wenn das etwas unnötig erscheint, aber der aktuellste GCC ist der 4.8.
Außerdem wäre ein Verweis auf die C++11-Unterstützung des GCC 4.8 bzw. der anderen Compiler nicht schlecht, damit man beim Kompilieren des C++11-Codes zwischen Inkompabilität des Compilers und Falschheit des Codes unterscheiden kann.
:duck-und-weg:
Swordfish schrieb:
kidpro schrieb:
http://www.umaterialien.de/ ist auch nicht schlecht [...]
Hab' mir mal die Pointer.ppt angesehenen - überzeugt mich nicht wirlich.
Guck dir mal Klassen.ppt an. Das wird dich mehr "überzeugen".
-
Kleine Korrektur zu Boost
Es gibt keinen aktuellen Installer mehr für Visual Studio (boostpro.com hat seine Pforten geschlossen; auch in der aktuellen Installationsanweisung ist kein Hinweis mehr auf Diesem).
-
asc schrieb:
Kleine Korrektur zu Boost
Es gibt keinen aktuellen Installer mehr für Visual Studio (boostpro.com hat seine Pforten geschlossen; auch in der aktuellen Installationsanweisung ist kein Hinweis mehr auf Diesem).
Joa, ist aber eigentlich auch nicht nötig. Wer für ein aktuelles Visual Studio boost haben will, ohne viel tun zu müssen, nimmt einfach BlueGo (Danke an Vertexwahn):
-
Swordfish schrieb:
C++11
C++11 ist die neueste Fassung des C++-Standards, welche im August 2011 von der ISO verabschiedet wurde und C++03 ersetzt.
Während das Verständnis einiger neuen Features wie z. B. Lambda-Ausdrücke, variadic templates und Multithreading samt tls solide Grundkenntnisse voraussetzt, sind andere bereits für Sprachneulinge interessant:
- C++11 - Artikel in der englischen Wikipedia samt Auflistung wichtiger Neuerungen
- ISO/IEC Document n3337 - im Grunde der Text des offiziellen Standards ISO/IEC 14882:2011 mit lediglich redaktionellen Änderungen
Hallo Swordfish,
kann man das nicht auf C++14 updaten.
Hier ist der link auf den (glaub) letzte Working-Draft für C++14 den es für lau gab: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf, gefunden auf https://isocpp.org/std/the-standardVielen Dank!
dirkskiEdit: besser anhängen als updaten, also einmal den existierenden für C++11 und den für C++14 darunter.
-
Also ich finde für absolute Anfänger dieses Buch hier https://www.amazon.de/Programmierung-für-Anfänger-Florian-Wollenschein/dp/3833422165 sehr Empfehlenswert, es beinhaltet zwar nicht viel Content, bietet aber alle einfachen Grundlagen und erklärt sie sehr verständlich, damit habe ich angefangen C++ zu verstehen, zudem verweist der anhang des Buches auf viele andere Werke für beginner und fortgeschrittene, vielleicht einen Kauf wert
-
IfundSwitchBuddy schrieb:
Also ich finde für absolute Anfänger dieses Buch hier https://www.amazon.de/Programmierung-für-Anfänger-Florian-Wollenschein/dp/3833422165 sehr Empfehlenswert, es beinhaltet zwar nicht viel Content, bietet aber alle einfachen Grundlagen und erklärt sie sehr verständlich, damit habe ich angefangen C++ zu verstehen, zudem verweist der anhang des Buches auf viele andere Werke für beginner und fortgeschrittene, vielleicht einen Kauf wert
Ich bin selbst Anfänger (präziser noch: Dilettant), aber das von Dir verlinkte Buch halte ich -- ausgehend davon, was Google Books mich einsehen lässt -- nicht für empfehlenswert. Der Ausdruck erscheint mir über weite Strecken ungelenk, das lässt sich allerdings verzeihen; fachliche Fehler, die wohl zum Teil auch auf dieser Schwammigkeit beruhen, wiegen schwerer. Ich habe versucht, einige davon zu finden und zu kommentieren; sollte ich dabei selbst danebengehauen haben, hoffe ich, dass man mich meinerseits zurechtweist.
Zur Einleitung:
- "1998 wurde mit ANSI C++ ein Standard geschaffen, der es erlaubt, dass ein C++-Programm auf jeder Plattform (Windows, Linux, ...) funktioniert."
Guten Willens kann man erkennen, was der Autor hiermit meinte; dennoch finde ich den Satz mindestens grob fahrlässig formuliert, denn plattformabhängiges Verhalten findet sich unter C++ nach wie vor. Für ein Elementarbeispiel gerade in Hinsicht auf den C++98-Standard siehe hier. - Zu 0.5: Es gibt zum Glück eine ganze Reihe von "logischen" Fehlern, die vom Compiler erkannt werden (ggf. warnstufenabhängig), obwohl es sich nicht um Syntaxfehler handelt.
- Zu 0.6: C++-Compiler werden vom Standard nicht dazu verpflichtet, "Nullen und Einsen" (besser: Maschinencode) zu erzeugen. Mit der Option -S speit z.B. die gcc plötzlich Assembly.
Zum 1. Kapitel ("Hallo Welt"):
- Diese "cin.get();"-Geschichte, um "falls nötig" ein Konsolenfenster offenzuhalten, halte ich für eine Unsitte, auch wenn sie nicht in jedes Listing zwingend eingebaut, sondern nur am Rande vorgeschlagen wird. Wenigstens empfiehlt der Autor nicht "system("PAUSE");".
- Das Wort "Präprozessoranweisung" wird eingeworfen, aber nicht erklärt. Ebenso verfährt der Autor kurz darauf mit dem Begriff "Funktion", der zuerst im Zusammenhang mit Namensräumen fällt; welche Bezeichner (nicht "Funktionen"!) im Hello-World-Listing nun den Namensraum std bewohnen, nämlich cout und endl, fällt dabei hinter den Schreibtisch.
- "Der Rückgabewert einer Funktion gibt oft Auskunft darüber, ob sie erfolgreich beendet wurde oder nicht." Anstatt Fehlercodes zurückzugeben und per Fallunterscheidung zu behandeln, sollte man in C++ besser Exceptions werfen. Natürlich kann man z.B. in einer Funktion, die ein std::array durchsuchen und den Index des zu findenden Elements liefern soll, -1 zurückgeben, wenn man die Nadel nicht im Heuhaufen gefunden hat; das fällt m.E. aber ebenfalls unter die zitierte Formel "erfolgreich beendet" mit Blick auf den Algorithmus, der den Funktionswert liefert. Abgesehen davon wird an dieser Stelle mit dem Begriff "Rückgabewert" wie selbstverständlich umgegangen.
- cout heißt nicht "console output", sondern "character output (stream)": http://en.cppreference.com/w/cpp/io/cout
Zum 2. Kapitel ("Konstanten und Variablen")
- Der Autor bezeichnet Literale anfangs schlicht als "Konstanten". Erst später geht er auf den Unterschied zwischen symbolischen und literalen Konstanten ein. Beispielsweise belegt er den Begriff "Zeichenkette/String" zunächst mit der Definition eines Stringliterals ("mehrere Zeichen, die in doppelte Anführungszeichen eingeschlossen sind").
- "Achten Sie darauf, dass Steuerzeichen in C++ immer in einfachen Anführungszeichen stehen, da sie wie ein Zeichen behandelt werden". Warum funktioniert dann cout << "\n";?
- Bits und Bytes: "0: Strom aus, 1: Strom an". Man spräche besser von High- und Low-Pegeln, zumal in einer Schaltung nicht garantiert ist, dass 0 als logischer Repräsentant des Low-Pegels auftritt ("positive/negative" Logik). "1111 1111" steht auch nicht unbedingt für die Dezimalzahl 255 (allerdings kann man z.B. von einem Isomorphismus zwischen den Wertemengen von signed char und unsigned char sprechen). "Berechnung" einer Binärzahl: besser "ihre Repräsentation zur Basis 10" oÄ.
- In der Tabelle zu den Basisdatentypen werden "Wertebereiche" präsentiert, als wären diese festgeschrieben. Tatsächlich handelt es sich "nur" um die Mindestanforderungen des Standards.
- Der Wertebereich von short darf höchstens so groß sein wie der von int und muss mindestens 2 Byte umfassen. Dass short allerdings einen streng kleineren Wertebereich umfasst als int, gilt laut Standard als implementationsabhängig.
- Ich vermute, der Autor versteht die Technik hinter IEEE-754-Gleitkommazahlen nicht, denn er versucht nicht einmal, zu erklären, wie die Datentypen float und double aus jenen Nullen und Einsen resultieren, die wir gerade besprochen haben.
- Zum Schnipsel "const float PI = 3.14159f;" schreibt der Autor: "Beachten Sie das f hinter der Zahl; es sorgt dafür, dass der Compiler die Zahl als float betrachtet, da standardmäßig double verwendet würde, was in diesem Fall Speicherplatzverschwendung wäre". Grober Unfug! Für eine symbolische Konstante vom Typ float wird keinesfalls der Speicherplatz einer solchen vom Typ double belegt; und da das bewusste Fließkommaliteral perfekt in eine float-Konstante passt, bereitet auch die vom Compiler vorgenommene implizite Konvertierung (die ein Einsteigerbuch im Zusammenhang mit Basisdatentypen unbedingt erwähnen sollte) in diesem Fall keine Probleme. Beide Varianten generieren mit der gcc exakt dieselbe Assembly. Richtig ist nur, das Fließkommaliterale ohne Suffix als vom Typ double betrachtet werden.
- Der Autor formuliert, als bestimmten global/local scope unabdingbar die Reservierung des Speicherbereichs, der mit dem Bezeichner angesprochen wird. Dem ist nicht so: Der Anspruch auf den reservierten Speicher, auf den der Bezeichner verweist (storage duration), bildet eine andere Kategorie als der Gültigkeitsbereich des Bezeichners (scope); nur haben "lokale Variablen" eben, wenn nicht anders angegeben (Schlüsselwort static in einer seiner Bedeutungen), automatische Verweildauer. Der Unterschied zwischen static und external linkage wird ebenfalls unterschlagen: man sollte wenigstens darauf hinweisen, dass es bei "global" eben auch noch Abstufungen gibt. -- Die Nuancen der Scope kann man überdies sehr viel genauer beschreiben als bloß mit "global/lokal": http://en.cppreference.com/w/cpp/language/scope
- Richtig böse ist das Beispiel zu Typecasts. Ich habe es zu Demonstrationszwecken kurz zu einem vollwertigen Programm ausgebaut; nur die ersten drei Zeilen in main() werden vom Autor selbst verwendet:
#include <iostream> using namespace std; int main() { short x = 100; cout << x << endl; cout << x + 0.5 << endl; return 0; }
Dieses Programm kompiliert anstandslos. Der Autor hält allerdings die dritte Zeile in main() für fehlerhaft, weil er seine eigenen Erklärungen anscheinend nicht beherzigt hat und seine eigenen Beispiele offenbar nicht immer ausprobiert: er behauptet, wir müssten x erst nach float casten, und verwendet dazu "cout << float(x) + 0.5 << endl;".
Was der Compiler beim Zusammenprall mit solchen C-Style-Casts intern versucht, ist tatsächlich zunächst "const_cast<float>(x)" (was hier nicht geht), anschließend "static_cast<float>(x)" (Quelle). Man sollte in C++ zum Casten von Basisdatentypen lieber gleich den Gebrauch von static_cast anstelle von C-Style-Casts empfehlen.
Zum Anhang:
- Die "ASCII-Tabelle" lässt die ersten 32 Zeichen weg (mit der Begründung, das seien "computerinterne Codes" -- ach was!) und verdeutlicht nicht den Unterschied zum erweiterten ASCII-Zeichensatz (ab Index 128 == 2^7).
- Glossar: Allgemein sehr knapp. Der Eintrag zu "Funktion" ("eigenständiges Programm...") gefällt mir nicht. Bei "Konstruktor" steht "Methode einer Klasse...": Methoden gehören per Definition zu einer Klasse. Zu "Operator: das Zeichen für eine bestimmte Operation" (gekürzt!) werde ich vornehm schweigen. Hübsch finde ich dagegen den nüchtern geflochtenen Kranz "Instanz: Objekt einer Klasse. [...] Objekt: Bezeichnung für die Instanz einer Klasse".
Wer mich nicht beim Wort nehmen, sondern selbst vergleichen will: Stroustrup in seinem "Einsteigerbuch" (PPP) über "Hello, World!". -- Kapitel 1 im vorgeschlagenen Buch zum selben Thema, meine Quelle für diese Kritik.
- "1998 wurde mit ANSI C++ ein Standard geschaffen, der es erlaubt, dass ein C++-Programm auf jeder Plattform (Windows, Linux, ...) funktioniert."
-
Nachtrag zu eigenem Schnitzer: Ich störe mich an meiner ungenauen Verwendung von "Isomorphismus". In obigem Zusammenhang hätte ich einfach von einer bijektiven Abbildung sprechen sollen.
-
Hab anhand eines neuen Tutorials den Einstieg gemacht nach dem Motto:
Theorie, Übung, gemeinsame Lösung finden. Fand ich gut, bisschen wie im Studium.
-
Dein Link funktioniert nicht.
Dieser Thread ist auch eher dafür gedacht, nur zu qualitativ hochwertigem Lehrmaterial zu verlinken. Kannst du die inhaltliche Qualität des genannten Tutorials beurteilen, wenn du doch absoluter Anfänger bist? Was du lobtest, könnte man so alles auch über ein Buch von Jürgen Wolf sagen. Die Qualität des Tutorials müsste man mal in einem eigenen Thread diskutieren (ich sehe, du hast damit bereits begonnen), dann kann man es eventuell hier aufnehmen.
(Es macht auch nicht gerade einen guten Eindruck, ein neu registrierter Nutzer zu sein, dessen Beiträge allesamt zu diesen Videos verlinken. Das stinkt doch sehr nach Werbeaccount )