Ändert sich durch die Genehmigung von C ++ '11, wie ein C ++ - Anfänger die Sprache lernt? [geschlossen]

21

Ich wollte C ++ für eine Weile lernen und nahm AP Computer Programming in der High School (damals, als es C ++ und nicht Java war). Ich mag C und habe gerade nicht die Zeit gefunden, C ++ zu lernen, oder ich greife einfach auf C # zurück, wo ich viel produktiver bin.

Meine Frage lautet: Angesichts der Tatsache, dass C ++ '11 genehmigt wurde (obwohl ich weiß, dass es nicht vollständig implementiert ist), ändert sich dadurch die Art und Weise, wie ich mit dem Erlernen von C ++ umgehen soll? Ich besitze C ++: The Complete Reference von Herb Schildt aus dem Jahr 1998. Macht es der neu genehmigte Standard weniger wichtig, aus solchen Büchern zu lernen als einige der neueren Tutorials / Bücher, die Dinge aus dem Standard enthalten? Hat es einen Vorteil, aus den älteren Büchern zu lernen?

Jetti
quelle
9
Oof. Schildt. Ich kann nicht mit der Qualität seiner C ++ - Materialien sprechen, aber seine C-Materialien waren lange Zeit unterdurchschnittlich (selbst die neueste Ausgabe von C: TCR weist noch einige nicht triviale Fehler auf). Ich würde empfehlen, nach einer aktuelleren Arbeit eines anderen Autors zu suchen.
John Bode
C ++ 11 hat die Grundlagen von C ++ nicht geändert, die gelernt werden müssen, um alles zu tun, was in der letzten Revision eingeführt wurde und in einer früheren Version von C ++ nicht vorhanden ist.
Ramhound
11
Traue niemals einem Buch von Herb Schildt. Wirklich, während die Mehrheit der C ++ - Bücher schlechte Bücher sind (und ich mich hier nicht auf stilistische Probleme beziehe, sondern auf offensichtliche sachliche Fehler und die Förderung von Programmierstilen, die bekanntermaßen zu fehlerhaftem Code führen), waren Schildts Bücher so hervorragend schlecht. sein Name wurde zu einem Mem.
sbi
4
@ Ramhound: Ich bin anderer Meinung. Wäre dies der Fall, würden wir immer noch alle zuerst das manuelle Ressourcenmanagement erlernen und erst dann sicherere Methoden, um dynamische Ressourcen zu erstellen. Zum Glück ändert sich dies (langsam). Neue Möglichkeiten, auch wenn sie "nur" in der Bibliothek vorhanden sind, erfordern neue Redewendungen. Wenn Sie mit einer Sprache beginnen, warum sollten Sie dann zuerst ältere Redewendungen lernen, um sie später wieder verlernen zu müssen?
sbi

Antworten:

16

Absolut. Heutzutage sollten sich drei Dinge, die normalerweise in Lektion 2 enthalten sind, sehr viel später bewegen:

  • Zeichenfolgen als Arrays von char *, den Methoden strlen, strxxx usw.
  • Arrays im Allgemeinen und Zeigerarithmetik
  • lösche was du neu hast, lösche [] was du neu hast [] und sogar Destruktoren

Diese Dinge, die normalerweise in Lektion 99 enthalten sind, sollten sich viel früher bewegen

  • Vorlagen als Dinge zu verwenden (schreiben, nicht so viel)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>, Iteratoren, andere Sammlungen

Jeder rohe Zeiger sollte sofort einem intelligenten Zeiger-Wrapper übergeben werden (ich würde mit "shared" beginnen und später als "unique" betrachten, da dazu die Referenzen std :: move und rvalue erklärt werden müssen). Auf diese Weise fühlt sich das Erlernen von C ++ wie das Erlernen von Java oder C # an, bei dem Sie die Bibliothek gleichzeitig mit der Sprache erlernen. Es wird auch viel Gedächtnisarbeit wegnehmen und die Leute weniger besorgt über Fallstricke sein lassen.

Ich würde auch Lambdas in das Bild einarbeiten, wenn wir zum ersten Mal durch eine Sammlung iterieren und mit jedem Element etwas anfangen wollten.

Haftungsausschluss: Ich schreibe gerade einen C ++ - Kurs für Pluralsight und benutze diesen Ansatz. Das letzte Modul ist das "Verstehen des Codes anderer Leute" und hier werde ich die verwirrenden Dinge wie Zeichenketten, manuelle Speicherverwaltung, Zeigerarithmetik und so weiter platzieren.

Update: Einige Leute haben gefragt, warum die Existenz von C ++ 0x Lehrinhalte inspiriert, die mit C ++ 03 hätten vermittelt werden können. Ich denke, es ist eine Reihe von Dingen:

  • Wirklich intelligente Zeiger, die sammlungsfreundlich sind, machen Dinge wie "eine Reihe von Zeigern für Mitarbeiter" überflüssig, die uns veranlassten, immer auf neue / Lösch -, Zeigerarithmetik usw. zurückzugreifen
  • auto beseitigt den Schmerz von Iterator-Deklarationen
  • Lambdas machen etwas, was ein gewöhnlicher Mensch tun würde
  • Selbst etwas so Triviales wie das >>korrekte Parsen beseitigt das GOTCHA, das beim Deklarieren einiger Vorlagen von Vorlagen vorhanden wäre
  • und so weiter

So wie ich das sehe, gibt es Dinge, die wir an der Art und Weise, wie wir C ++ unterrichteten, vor einiger Zeit hätten ändern können, aber einige von uns hielten sich zurück, weil wir immer noch den Old-School-Weg für einen Fallback brauchten oder weil das Unterrichten einfach viel bedeutete des arkanen Wissens.

Kate Gregory
quelle
3
Warum sollten Sie die manuelle Speicherverwaltung später lernen? Ich denke, es ist wichtig zu wissen und es gibt mehr Wertschätzung beim Lernen von intelligenten Zeigern. Ich musste Speicherverwaltung (und Zeichen-Arrays) in C lernen, und dadurch habe ich RAII und std :: string viel mehr geschätzt, als ich gedacht hätte, wenn ich es nicht hätte tun müssen.
Jetti
1
Ihre Beispiele beziehen sich hauptsächlich auf C ++ 98 im Vergleich zu C ++ vor dem Standard, nicht auf C ++ 03 im Vergleich zu C ++ 11. Ich nehme an, dass gegebenes Lambda std::for_each()viel populärer als früher ist, autosehr wichtig ist und die neue Syntax der Funktionsdeklaration (in Verbindung mit decltype) im Vorlagencode ziemlich häufig verwendet wird. Das sind Dinge, die kein aktuelles C ++ - Buch lehrt. Aber im Allgemeinen stimme ich Ihnen zu ( +1). Als ich angefangen habe, C ++ - Kurse zu geben, habe ich mit Accelerated C ++ angefangen , und obwohl mein Kurs immer mehr davon abweicht, bleibt er dem zugrunde liegenden Prinzip treu.
sbi
3
@Jetti: Ich mache selten manuelle Ressourcenverwaltung, und wenn, dann für die Implementierung von RAII-Klassen. Ich benutze jedoch viele dieser Klassen. Demnach scheint der Einsatz von RAII-Materialien wichtiger als der Umgang mit Rohstoffen und sollte daher früher und mit mehr Nachdruck vermittelt werden.
sbi
1
@sbi: Da muss ich Ihnen zustimmen - die meisten dieser Beispiele scheinen Modern C ++ 101 von 2006 zu sein, nichts Neues an C ++ 11.
DeadMG
2
@Jetti: Der wichtigste Schritt zur Beherrschung von C ++ ist das Erlernen aller Methoden, mit denen Sie die manuelle Speicherverwaltung umgehen können. Es ist absolut etwas, das "später" beigebracht werden sollte, sobald Sie gelernt haben, wie weit Sie durch die "automatische" Speicherverwaltung gehen können.
Jalf
9

Ziemlich genau, ja. Die einfache Tatsache ist, dass in C ++ 98 und 03 viele bewährte Methoden aufgrund der schlechten Qualität der Sprachunterstützung für z. B. funktionale Programmierung grundsätzlich unbrauchbar waren. Jetzt, wo Lambdas existieren und funktionieren, neigen die Menschen dazu, funktionale Schnittstellen viel besser zu akzeptieren als früher, und die generische Programmierung ist noch stärker als zuvor.

Im Jahr 1998 begannen die Leute erst zu entdecken, wie man mit C ++ hochwertigen, sicheren und schnellen Code schreibt, und eine Menge Code lautete "C was Classes". In C ++ 11 gibt es sehr unterschiedliche Ausdrücke wie Kopieren und Vertauschen und die Dreierregel (jetzt Fünf) ist bekannt und definiert, und viel mehr Ressourcenverwaltungstypen sind zu Standards geworden, wie shared_ptrund unique_ptrwo die vorherigen Standards sie einfach verlassen haben als klaffende Löcher.

Sie können diese Frage für eine hervorragende Liste von Referenzmaterial in C ++ anzeigen .

DeadMG
quelle
1
Eigentlich würde ich den Anfang vom Ende von "C with classes" ein paar Jahre früher als 1998 setzen, aber im Allgemeinen haben Sie sicherlich Recht, und ich würde nicht über ein halbes Jahrzehnt feilschen. +1von mir.
sbi
4

Ich kenne das spezifische Buch nicht, das Sie erwähnen. Im Allgemeinen kann man jedoch sagen, dass alle Grundlagen zu C ++ - Syntax, Datentypen und OOP weiterhin zutreffen. Dasselbe sollte für die STL-Bibliotheken gelten, die in den meisten Anfängerbüchern erwähnt werden.

Obwohl ein Buch von 1998 möglicherweise einige Aktualisierungen und Entwicklungen im C ++ - Programmierstil übersehen hat, die sich im Laufe der Jahre in der Community angesammelt haben. Ich würde etwas mehr aktuelle Ressourcen suchen. Es gibt mehr als genug kostenlose Online-Tutorials und -Dokumente, die Ihnen einen guten Einstieg ermöglichen sollen. Einige von ihnen erwähnen möglicherweise sogar C ++ 0x.

C ++ 0x wird sicherlich viel daran ändern, wie Programmierer die Sprache in Zukunft sehen und verwenden. Dies würde jedoch komplexere Projekte beeinflussen, bei denen die neuen Funktionen allmählich Sinn machen. Für einen Anfänger sollte dies keine Rolle spielen und Sie können sich darauf konzentrieren, sich mit den vorhandenen Konzepten vertraut zu machen. Das ist bereits genug, um zu lernen. Die meisten Einsteigerbücher befassen sich zum Beispiel nicht sehr intensiv mit Vorlagen, sodass Sie die neuen variadischen Vorlagen nicht unbedingt kennen müssen.

Vielleicht sehen Sie sich eine Liste der Änderungen an . Zumindest einige Konzepte wie " Range based for Loops" werden höchstwahrscheinlich auch für Anfänger in neuen Tutorials erscheinen. Ein Blick lohnt sich also.

thorsten müller
quelle
Vielen Dank! Wissen Sie von anständigen Online-Ressourcen oder Büchern?
Jetti
2
Nein, die cplusplus-Site wird oft als Ressource erwähnt, die niemals an jemanden weitergeleitet werden sollte, für den Sie wirklich guten Code schreiben möchten.
DeadMG
@DeadMG Haben Sie eine alternative Website?
TheLQ
@TheLQ: Du würdest mit der MSDN Referenz weiter kommen, oder cprogramming.com.
DeadMG
@ Jetti: Mir ist kein Material für die Verwendung von C ++ 11 zum Unterrichten von C ++ bekannt. Alles, was ich gesehen habe, bringt C ++ 11 zusätzlich zu C ++ 03 bei. Letzteres erfahren Sie unter stackoverflow.com/questions/388242/… .
sbi
3

In Bezug auf alles, was mit Technologie zu tun hat, ist es natürlich immer eine kluge Entscheidung, mit dem neuesten Material auf dem neuesten Stand zu sein. Die in C ++ 11 eingeführten Änderungen sind jedoch darauf ausgelegt, das Boot nicht ins Wanken zu bringen. Wenn Sie neu in C ++ sind (oder generell programmieren), ist dies nichts, worüber ich mir Sorgen machen müsste.

Wenn Sie ein professioneller Programmierer sind, können Sie sicher sein, dass Sie in Zukunft an dem Code einer anderen Person arbeiten. Es ist also immer von Nutzen, die Funktionsweise zu verstehen, auch wenn es sich in der Praxis um eine abgewertete Technik handelt.

Löwe
quelle
Vielen Dank für Ihre Antwort, ich dachte mir, dass es mir zumindest helfen würde, alten Code zu betrachten, wenn ich eine alte Ressource verwende.
Jetti
Wie können Lambda autound asynchrone Funktionsausführung etwas anderes bewirken als "rock the boat"?
sbi
1
Ich würde behaupten, es gibt einen Unterschied zwischen der Einführung neuer Tools und einer umfassenden Veränderung der Designphilosophie (wie wir es zum Beispiel bei PHP sehen)
Leo,
1
@leo: Ich stimme nicht zu. Die Einführung von STL, intelligenten Zeigern und umfangreichen Vorlagenfunktionen hat die Mainstream-Designphilosophie von C ++ grundlegend verändert. So gut wie jede Boost - Bibliothek ist völlig anders als der Durchschnittswert der C ++ Bibliothek der 90iger Jahre.
sbi