Wird modernes C ++ immer häufiger? [geschlossen]

132

Als ich vor 6-7 Jahren C ++ zum ersten Mal lernte, lernte ich im Grunde "C mit Klassen". std::vectorwar definitiv ein fortgeschrittenes Thema, etwas, über das man lernen konnte, wenn man es wirklich wollte. Und es gab sicherlich niemanden, der mir sagte, dass Destruktoren genutzt werden könnten, um das Gedächtnis zu verwalten. Heute sehe ich überall RAII und SFINAE und STL und Boost und Modern C ++. Sogar Leute, die gerade erst mit der Sprache anfangen, scheinen diese Konzepte fast vom ersten Tag an zu lernen.

Meine Frage ist, ist dies einfach, weil ich nur das "Beste" sehe, dh die Fragen hier auf SO und auf anderen Programmierseiten, die Anfänger anziehen (gamedev.net), oder ist dies tatsächlich repräsentativ für die C ++ Community als Ganzes?

Wird modernes C ++ wirklich zum Standard? Wird es nicht so, wie die Experten es schreiben, sondern "so wie C ++ einfach ist"? Oder kann ich einfach nicht die Tausenden von Menschen sehen, die noch "C mit Klassen" lernen und ihre eigenen dynamischen Arrays schreiben, anstatt sie zu verwenden std::vector, und die Speicherverwaltung durchführen, indem sie manuell new / delete aus ihrem Code der obersten Ebene aufrufen?

So sehr ich es auch glauben möchte, es scheint unglaublich, ob sich die C ++ - Community insgesamt in ein paar Jahren so stark entwickelt hat. Was sind Ihre Erfahrungen und Eindrücke?

(Haftungsausschluss: Jemand, der nicht mit C ++ vertraut ist, könnte den Titel falsch interpretieren und fragen, ob C ++ im Vergleich zu anderen Sprachen immer beliebter wird. Das ist nicht meine Frage. "Modern C ++" ist ein gebräuchlicher Name für einen Dialekt oder Programmierstil in C ++, benannt nach dem Buch. " Modernes C ++ - Design: Generische Programmierung und angewandte Entwurfsmuster ", und ich interessiere mich ausschließlich für dieses im Vergleich zu" altem C ++ ". Sie müssen mir also nicht sagen, dass die Zeit von C ++ vorbei ist und wir alle Python verwenden sollten;))

jalf
quelle
2
Leider denke ich, dass es eine Weile dauern wird, bis die C ++ - Community als Ganzes so weit fortgeschritten ist, dass sie erkennt, wie die Standardbibliothek verwendet und zusammen mit den kommenden C ++ 0x-Ergänzungen verbessert wird, geschweige denn Code mit ähnlichen Methoden implementiert wird. Ich denke jedoch, dass C ++ 0x viel Hoffnung bringt, die Popularität von C ++ zu steigern. Viele tägliche syntaktische Unannehmlichkeiten wurden verbessert. Ich habe diese Dinge immer als kleinlich angesehen, aber für externe Personen, die sich die Sprache ansehen, ist dies eine häufige Quelle von Beschwerden.
stinky472
15
Wenn ich in meinem Fall auf einen Fachmann stoße, der moderne C ++ - Techniken wie RAII und Ausnahmesicherheit (die sich nicht unbedingt auf Alexandrescus Buch beziehen) oder sogar die grundlegendsten Konzepte wie Iteratoren und generische Algorithmen versteht, finde ich zehn weitere, die nicht verstehen. Zumindest wenn es um Profis geht, sind viele von ihnen zu sehr mit Fristen beschäftigt, um etwas Wissen zu lernen, sodass selbst selbsternannte C ++ - Profis oft viel zu lernen haben. Ich fürchte, ich werde auch einer von denen mit C ++ 0x: Ich muss noch viel lernen und mich darauf einstellen, und ich habe Termine einzuhalten.
stinky472

Antworten:

76

Ich denke, die Dinge haben sich so entwickelt.

Die erste Generation von C ++ - Programmierern waren C-Programmierer, die C ++ tatsächlich als C mit Klassen verwendeten. Außerdem war die STL noch nicht vorhanden, und genau das war C ++ im Wesentlichen.

Als die STL herauskam, brachte das die Dinge voran, aber die meisten Leute, die Bücher schrieben, Lehrpläne zusammenstellten und Klassen unterrichteten, hatten zuerst C gelernt, dann das zusätzliche C ++ - Zeug, also lernte die zweite Generation aus dieser Perspektive. Wie eine andere Antwort feststellte: Wenn Sie std::for_eachgerne regelmäßig für Loops schreiben, bringt Ihnen die Änderung der Verwendung nicht viel, außer dem warmen, verschwommenen Gefühl, dass Sie die Dinge auf "moderne" Weise erledigen.

Jetzt haben wir Ausbilder und Buchautoren, die das gesamte C ++ verwendet haben und ihre Anweisungen aus dieser Perspektive erhalten, wie beispielsweise das Accelerated C ++ von Koenig & Moo und das neue Lehrbuch von Stroustrup. char*Dann lernen wir also nicht std::strings.

Es ist eine interessante Lektion darüber, wie lange es dauert, bis "Legacy" -Methoden ersetzt werden, insbesondere wenn sie eine Erfolgsbilanz der Effektivität aufweisen.

JohnMcG
quelle
13
Ja. Es war sehr klug, C ++ aufgrund der riesigen installierten Basis von C-Codierern in hohem Maße abwärtskompatibel mit C zu machen. Sehr ähnlich der erfolgreichen Strategie von MS, immer die Abwärtskompatibilität mit DOS aufrechtzuerhalten. (Siehe Raymond Chens ausgezeichneten Blog für die oft schmerzhaften Längen, die sie gingen ...)
j_random_hacker
2
Hoppla, da ist ein bisschen tangential vorgegangen ... Ich möchte damit sagen, dass Sie mit der "Generationsunterschiede" zwischen denen, die von C gewechselt sind (aber das Denken im C-Stil beibehalten haben) und denen, deren "erster Geschmack", Recht haben "war nach STL C ++.
j_random_hacker
57

Absolut ja. Wenn Sie C ++ nicht in diesem "modernen C ++" - Stil programmieren, wie Sie es nennen, macht es für mich keinen Sinn, C ++ zu verwenden! Sie können auch einfach C verwenden. "Modern C ++" sollte meiner Meinung nach die einzige Möglichkeit sein, C ++ jemals zu programmieren, und ich würde erwarten, dass jeder, der C ++ verwendet und auf diese "moderne" Weise programmiert hat, mir zustimmt. Tatsächlich bin ich immer völlig schockiert, wenn ich von einem C ++ - Programmierer höre, der sich Dinge wie auto_ptr oder ptr_vector nicht bewusst ist. Für mich sind diese Ideen grundlegend und grundlegend für C ++, und so konnte ich es mir nicht anders vorstellen.

Ray Hidayat
quelle
4
+1; Ich habe den "modernen C ++" - Stil schon früh aufgegriffen, weil dies der natürliche Weg ist (wenn Sie nicht an C mit Klassen denken).
Adam Hawes
21
"Verwenden Sie einfach C?" C ist verdammt mächtig.
Clark Gaebel
4
Die Roboter werden sicher nicht in C ++ programmieren, sie sind nicht dumm genug und würden beim Versuch, sie zu kompilieren, einfrieren.
Matt Joiner
6
@ClarkGaebel Nun, wenn C mächtig ist, ist C ++ auch durch seine Vererbung von C ohne seine Probleme :)
legends2k
4
@rxantos, Sie sagen, dass wir nicht genügend Optionen zur Bewertung der Leistung haben, z. B. Anzeigen der Baugruppenausgabe, Timer, RAM-Monitore und vieles mehr. C ++ unterscheidet sich in dieser Hinsicht nicht von C. Im Zweifelsfall Profil. Alles andere ist nur Hörensagen.
underscore_d
25

In den Tagen von Windows 3.1 war C der Standard. Als C ++ auf den Entwicklermarkt kam und später zum ANSI-Standard wurde, war es die neue Schärfe. Es hat das Akronym OOP und einige der grundlegenden Entwurfsmuster unter Verwendung von Polymorphismus populär gemacht.

Mit der größeren Akzeptanz von verwalteten Plattformen mit geringer Eintrittsbarriere wie C # /. NET gibt es weniger Gründe, C ++ zu verwenden. So viel von der Entwicklerbasis wird eine Wahl haben und seien wir ehrlich: C ++ ist ein Bär, den man für Anfänger lernen sollte. Mit C # können Sie einfach damit laufen.

Das lässt wirklich nur die Plattformen übrig, die C ++ und die eingefleischten C ++ - Evangelisten brauchen, um die Kunst weiter zu praktizieren. Dies ist die Community, die alle Abstraktionsebenen benötigt und will, die als "Modern C ++" gelten.

Also ja, ich glaube, dass "Modern C ++", wie Sie sagen, immer häufiger wird. Es ist jedoch bei einem anderen Publikum weit verbreitet als in der Vergangenheit.

Spoulson
quelle
Komm schon Leute, diese Antwort macht einige gute Punkte. C ++ ist nicht perfekt, das wissen wir alle. Bjarne selbst beschwert sich, dass es zu groß und zu schwer zu lernen ist. Obwohl ich nicht einverstanden bin, warum Modern C ++ so allmählich entstanden ist - IMHO dauert es nur so lange, bis eine so große Sprache "vorwärts rumpelt".
j_random_hacker
4
Sie sagen also, dass die durchschnittlicheren Entwickler zu C # und so weiter gingen, während die Hardcore-Entwickler mehr mit C ++ zu tun hatten? (Nicht, dass es nicht wirklich kluge C # /. NET-Leute gibt, aber es gibt eine Menge weniger kluger.) Macht einen gewissen Sinn.
David Thornley
3
Ich denke, das ist ein gültiger Punkt. Natürlich trifft dies nicht auf alle zu, aber ich stimme weitgehend zu, dass die meisten Menschen, die die Wahl haben, bereits C # oder Java oder andere solche Sprachen gewählt haben.
Jalf
3
Anwendungsfälle: Ich möchte, dass ein Windows-Client CRUD auf meiner Datenbank ausführt. Verwenden Sie C # /. NET oder C ++ / MFC? Ich möchte eine Web-App ... Verwenden Sie C # / ASP.NET oder C ++ / ISAPI? Ich möchte einen einfachen "Nybbles" -Klon mit DirectX C # /. NET oder C ++ / MFC / WTL? Ich möchte eine erfolgreiche Demo bei Assembly09 ... definitiv C ++ (vs. C #).
Spoulson
8
Ich weiß nicht, ob es um mehr Abstraktionsebenen oder mehr Härte geht. Ich vermute, es ist nur so, dass die Arten von Abstraktionen, die über Vorlagen verfügbar sind, in Java oder C # nicht verfügbar waren, sodass die Leute, die sie mochten oder brauchten, bei C ++ blieben.
Kragen Javier Sitaker
16

Ich bin einer dieser Leute, die gelernt haben, wie man mit der STL arbeitet, und vom ersten Tag an viel über RAII und gute C ++ - Programmierpraktiken gehört haben. Sieht aus wie einige der am meisten empfohlenen Bücher zum Erlernen von C ++ heute (wie Accelerated C ++ und die Effective C ++ - Reihe ) Konzentrieren Sie sich auf die Verwendung von STL-Tools, anstatt Ihre eigenen Inhalte zusammenzufassen, und geben Sie viele "Regeln" für eine effektive (oder "moderne") Programmierung an.

Aber im Gespräch mit Freunden habe ich auch festgestellt, dass einige Unternehmen immer noch mit "C with Classes" arbeiten, nicht mit "Modern C ++". Vielleicht wird sich eines Tages die von den Autoren und Anwendern des "Modern C ++" vorgeschlagene Kultur durchsetzen :)

jfsantos
quelle
Wo ich arbeite, verwenden wir immer noch C mit Klassen, wahrscheinlich weil es viele Oldtimer gibt, die schon eine Weile dort sind. Sie scheinen sogar der STL gegenüber sehr vorsichtig zu sein, geschweige denn BOOST.
aneccodeal
12

Ich denke, du hattest gerade eine schlechte Erfahrung.

Sie müssen sich Scott Meyers Effective C ++ - Bücher zulegen. Ich habe 1999 wütend mit C ++ angefangen. Mein Teamleiter hat mich dazu gebracht, Effective C ++ und More Effective C ++ zu lesen, bevor ich JEDEN Code einchecken durfte.

Die meisten seiner Beratung ist auf den Linien von „ Verwenden Sie dieses nicht verwenden Feature , aber wenn es sein muss, halten diese im Auge“

Wenn Sie seinem Rat folgen, schreiben Sie gutes oder "modernes" C ++.

Er hat jetzt auch ein Buch über STL, das ich aber nicht gelesen habe.

Binärer Worrier
quelle
Ich sollte erwähnen, dass dies nur mein Ausgangspunkt war. Heute bin ich sehr zufrieden mit STL, Boost, RAII und allem anderen. Ich habe mich nur gefragt, wie häufig meine ersten Erfahrungen waren.
Jalf
9

In meinen C ++ - Jobs habe ich festgestellt, dass die modernen Funktionen zunehmend verwendet werden, und immer mehr Leute haben mich in Telefonvorführungen und Interviews danach gefragt. Soweit ich das beurteilen kann, fangen sie an.

Ich habe C ++ ursprünglich als C mit Klassen gelernt. Obwohl die Sprache weit darüber hinaus fortgeschritten war, waren die Bücher, die ich las, und die Leute, mit denen ich arbeitete, fest in "altem C ++" verankert. RAII etwas, worüber die Leute nachdenken würden, anstatt es automatisch zu tun, und ich erinnere mich, dass ich einige der frühen Artikel über die Probleme der Ausnahmesicherheit gelesen habe.

Wie bereits erwähnt, gibt es jetzt neue Bücher. Viele der alten sind immer noch relevant, aber sie scheinen zunehmend voller Erklärungen zu sein, warum offensichtlich schlechte Ideen schlecht sind. (Ebenso ist es für moderne Leser schwer zu verstehen, wie revolutionär Freuds Vorstellungen von einem Unbewussten waren, da es jetzt konventionelle Weisheit ist.)

Stroustrup hat gerade ein Lehrbuch herausgebracht: Programmieren: Prinzipien und Praxis mit C ++ . Ich habe es gekauft, weil ich es noch nicht versäumt habe, gute Sachen aus einem Buch von Stroustrup zu lernen, aber die ersten Kapitel nicht hinter mich gebracht habe. Bisher kann ich nur sagen, dass ich die Art und Weise, wie er anfängt, gutheiße, und es ist zumindest eine gute Einführung in die Verwendung von C ++.

David Thornley
quelle
Selbst die ersten Versionen der STL waren nicht ausnahmesicher.
Kragen Javier Sitaker
2
Zu dieser Zeit wusste niemand wirklich, wie man ausnahmesicheren Code schreibt. Dies wurde in den Jahren nach der Veröffentlichung des Standards erarbeitet. Ich erinnere mich an einige Artikel in C ++ Report.
David Thornley
7

Während ich an dem Projekt arbeite, an dem ich derzeit beteiligt bin, gibt es viel C ++ - Code, der sich über einen bedeutenden Zeitraum (seit über 10 Jahren) entwickelt hat. Die Entwicklung, von der Sie sprechen, ist dort deutlich sichtbar: Der ältere Code ist häufig "C mit Klassen" - Rohzeiger, char*Zeichenfolgen und Verwendung der zugehörigen C-Funktionen, Arrays usw.; Neuerer Code verwendet intelligente ATL-Zeiger und dergleichen, um Ressourcen zu verwalten, bleibt jedoch die meiste Zeit bei handcodierten Schleifen, und Iterator ist ein seltener Anblick. und der neueste ist voll von STL-Containern, Algorithmen,shared_ptr(einschließlich benutzerdefinierter Löscher zum Verwalten von Handles usw.), stark generierte Funktions- und Klassenvorlagen usw. Die meisten herkömmlichen Codierungstechniken "C mit Klassen", wie z. B. nicht gekapselte Rohzeiger mit manueller Lebensdauerverwaltung, werden heutzutage in Codeüberprüfungen sehr verpönt. Demnach scheint Ihre Beobachtung korrekt zu sein.

Die jüngste Entwicklung scheint eine Modeerscheinung für C ++ 0x-Lambdas zu sein - was eine positive Seite hat, da sie auch das Gleichgewicht zugunsten der Verwendung von Standardalgorithmen gegenüber handcodierten Schleifen neigt, da Sie jetzt Ihren gesamten Code inline haben können auch Algorithmen.

Pavel Minaev
quelle
6

Ich würde nicht sagen, dass std :: vector heutzutage als "modern" gilt. Es ist wirklich einfach.

Generell habe ich den Eindruck, dass die Leute einige Erfahrungen mit dem modernen C ++ - Stil gesammelt und sich ein wenig ernüchtert haben. Um nur ein einfaches Beispiel zu nennen: STL for_each war interessant, aber in der Praxis bringt es nicht viel Wert über eine einfache C-Schleife. Das Debuggen ist schwieriger und bietet manchmal nicht die beste Leistung. Auch die Konstrukte für die funktionale Programmierung in der aktuellen STL sind im Allgemeinen sehr umständlich, insbesondere wenn Sie Erfahrung mit einer echten funktionalen Sprache wie ML haben.

Johan Kotlinski
quelle
1
Warum ist Vektor Ihrer Meinung nach nicht modern? Für viele Anwendungsfälle ist es immer noch der Stand der Technik, auch wenn es grundlegend ist. Aber ich denke, etwas Grundlegendes bedeutet nicht, dass es nicht modern ist. eher das Gegenteil, wenn überhaupt. aber ich denke, ich stimme Ihrem zweiten Absatz zu :)
Johannes Schaub - litb
4
aber ich denke, das liegt daran, dass einige Leute versuchen, for_each und friends grundsätzlich für alles zu verwenden, selbst für Dinge, bei denen eine einfache for-Schleife viel prägnanter wäre - das Aufblähen einer 2-Zeilen-Schleife auf bis zu 10 Zeilen. Ich erwarte, dass mehr Leute for_each und Freunde verwenden, wenn Lambda in C ++ 1x verfügbar sein wird
Johannes Schaub - litb
7
Der grundlegende Vektor ist genau der Punkt. Es war nicht immer einfach. Früher wurde es allgemein als superkompliziert (es wurden TEMPLATES verwendet) und ineffizient (es ist kein rohes Array) angesehen. Etwas, über das die Experten vielleicht predigen, aber viele Menschen vertrauten einfach nicht.
Jalf
2
Vielleicht, weil std :: for_each selten das ist, was Sie brauchen, um zu sagen ... std :: transform? Die Verwendung eines Algorithmus hilft Ihnen dabei, einen sehr häufigen Fehler zu beseitigen: eine falsche Schleifenbedingung.
Edouard A.
Vektor <bool> ist sicherlich nicht grundlegend ...
Kugel
6

Nach meiner Erfahrung (spanische Universität) ist es leider die Norm, Sprachen nicht an sich zu betrachten. Sie verwenden die einfachsten Sprachen, um Programmieren zu unterrichten (dh Java), da dies für Lehrer und Schüler einfach sein soll, und verwenden dann C für die Betriebssystemklassen und dergleichen.

C ++ wird nur geringfügig eingeführt (jedenfalls in jedem Kurs), nur um ein C mit Klassen zu versehen. Sie kommen nicht in Boost oder sogar STL. Ich denke, dass es sowohl für Lehrer als auch für Schüler kostspielig ist, mit allen Eigenschaften und Denkweisen von C ++ Schritt zu halten. Wie viele C ++ - Programmierer hier kennen genug von allen Boost-Bibliotheken, um sie zu verwenden, um eine bessere Lösung zu finden oder sie zu entwerfen? Man muss ein Interesse daran haben, mit all den neuen Bibliotheken und Redewendungen Schritt zu halten.

Wie gesagt, es scheint jedoch, dass das Programmieren im Allgemeinen (und die Programmiersprachen im Besonderen) nicht zu ernst genommen werden, da es eine zeitliche Aufgabe zu sein scheint, wenn sie einen Job beginnen, und dann vergessen, wie man programmiert, wenn sie in den USA aufsteigen Unternehmensbaum. Viele Unternehmen hier und die Universität selbst haben das Gefühl, dass die Programmierung von jedem durchgeführt werden kann.

Wenn Sie dieser Philosophie folgen, wird C ++ für die meisten Menschen, die ich kenne, immer "C mit Klassen" sein.

Grüße,

Diego Sevilla
quelle
Das meiste davon ist in der Informatik sehr verbreitet, und im Großen und Ganzen halte ich es nicht für eine schlechte Sache. (Das heißt, ich konzentriere mich nicht auf die Sprache. Die Sprachen, die unterrichtet werden, sollten natürlich immer noch richtig unterrichtet werden.)
Jalf
+1: "(Ich konzentriere mich nicht auf die Sprache, das heißt. Die Sprachen, die aRE unterrichtet, sollten offensichtlich immer noch richtig unterrichtet werden.)"
Jared Updike
6

Nach meiner Erfahrung hängt dies stark vom Alter des Softwareprodukts / -projekts ab. Die meisten mir bekannten neuen Projekte verwenden modernes C ++ (RAII, STL, Boost). Es gibt jedoch viele C ++ - Projekte, die älter als 10 Jahre sind, und Sie sehen dort kein modernes C ++.

Denken Sie auch daran, dass einige der beliebtesten STL-Implementierungen bis vor vielleicht 5 Jahren ziemlich kaputt waren (MSVC <7.0 und GNU <3.00).

Nemanja Trifunovic
quelle
4

Ich denke, das größte Hindernis, auf das ich gestoßen bin, ist die Unterstützung von Toolchain, insbesondere bei plattformübergreifenden Projekten. Bis vor einigen Jahren war es üblich, Build-Notizen zu sehen, in denen stand: "Die x-Plattform benötigt STLport, um zu funktionieren, weil ihr Compiler überlastet ist." Sogar jetzt sehe ich Probleme mit Leuten, die versuchen, mehrere Abhängigkeiten von Drittanbietern zu verwenden, die an verschiedene Versionen von BOOST gebunden sind. Dies macht das Verknüpfen unmöglich, was bedeutet, dass Sie zurückgehen und Ihre Deps von Grund auf neu erstellen müssen.

Jetzt, da fast jeder MSVC ++ 6 nicht mehr verwendet, liegt das STLport-Chaos hinter uns. Sobald TR1 jedoch nicht mehr verfügbar ist, kehren wir zu "Welche Versionen welcher Umgebungen unterstützen es und machen es richtig" zurück, und dies wird die Akzeptanz erneut verlangsamen.

Ich arbeite an einem Projekt, das 1992 in C (nicht in C ++) begonnen wurde. Die Bereitstellung moderner Praktiken in der gesamten älteren Codebasis wäre unmöglich. Ebenso arbeite ich an einem anderen Projekt, das dem neuesten Stand der C ++ - Sprache viel näher kommt.

XenonofArcticus
quelle
3

Viele Teams, in denen ich war und von denen ich gehört habe, betrachten das große "Verwenden wir Ausnahmen?" Frage. Dies ist Code für "Verwenden wir modernes C ++?"

Wenn Sie keine Ausnahmen verwenden, können Sie nicht die volle Leistung der Sprache und ihrer Bibliotheken nutzen.

Viele ältere Codebasen sind jedoch ausnahmslos, und es wird als schwierig empfunden, Ausnahmen in eine Codebasis zu integrieren, die sie nicht erwartet, oder in ein Team, das nicht weiß, wie sie verwendet werden sollen. In solchen Fällen lautet die Antwort oft 'nein'.

Nach meiner Erfahrung braucht modernes C ++ jemanden, der eine Leidenschaft für das Team hat und der nichts weniger ertragen kann, um darauf zu drängen. Es muss auch die Einwände derer überwinden, die möchten, dass es eher dem Legacy-Code ähnelt.

Ich glaube zwar nicht, dass alte C ++ - Codebasen sehr schnell verschwinden, aber ich glaube, dass es mehr dieser leidenschaftlichen Menschen auf der Welt gibt als vor fünf Jahren. Sie stehen vor dem gleichen harten Kampf wie vor fünf Jahren, aber es ist wahrscheinlicher, dass sie verwandte Geister finden.

Drew Hoskins
quelle
3

Bevor Sie eine solche Frage beantworten können, müssen Sie sich darauf einigen, was "modern" ist. Dies ist unwahrscheinlich, da "Modern" ein schlecht definiertes Wort ist und für verschiedene Menschen unterschiedliche Bedeutungen hat. Der Titel von Alexandrescus Buch (Modern C ++ Design) hilft auch nicht wirklich, da es sich größtenteils um ein Buch über Template Metaprogramming handelt, das ein spezifischer Bereich von C ++ ist, aber keineswegs der einzige.

Für mich "Modern C ++"! = "Template Metaprogramming". Ich würde sagen, dass die Funktionen von C ++ über C in folgende Kategorien fallen:

  • Klassen (Konstruktoren, Destruktoren, RAII, Dynamic Casting und RTTI)
  • Ausnahmen
  • Verweise
  • Datenstrukturen und Algorithmen in der Standardbibliothek (STL)
  • iostreams
  • Einfache Klassen- und Funktionsvorlagen
  • Vorlagen-Metaprogrammierung

Keines davon ist besonders modern, da es alle fast 10 Jahre oder länger her ist. Die meisten dieser Funktionen sind nützlich und ermöglichen es Ihnen, in vielen Anwendungsfällen produktiver als Straight C zu sein. Ein guter Programmierer sollte und wird sie alle in einem Projekt mit angemessener Größe verwenden, aber eines dieser Dinge ist nicht wie das andere:

Vorlagen-Metaprogrammierung.

Die kurze Antwort auf die Metaprogrammierung von Vorlagen lautet einfach Nein. Leider ist es für manche Leute aufgrund des Buches gleichbedeutend mit "Moderner C ++ - Programmierung", aber am Ende schafft es mehr Probleme als es löst. Wenn C ++ keine besseren generischen Programmiermechanismen wie Reflektion entwickelt, ist es für die generische Programmierung schlecht geeignet, und höhere Sprachen wie Python eignen sich besser für diese Anwendungsfälle. Aus diesem und vielen anderen Gründen finden Sie in der C ++ - FQA

Anton I. Sipos
quelle
6
Die Metaprogrammierung von IMHO-Vorlagen wird für die Anwendungsprogrammierung fast nie benötigt , da sie nur dazu dient, auf Kosten der Lesbarkeit und schwer verständlicher Fehler einen möglicherweise unnötigen Grad an Allgemeinheit bereitzustellen. OTOH ist jedoch äußerst nützlich für Experten beim Erstellen von Bibliotheken (a la Boost), bei denen die zusätzliche Allgemeinheit nützlich ist und die (hässlichen, kniffligen, verwirrenden) Mechanismen nicht sichtbar sind.
j_random_hacker
3
Sie haben Recht damit, dass die Metaprogrammierung von Vorlagen geschmackvoll verwendet werden kann, wenn sie in Maßen durchgeführt wird, insbesondere in Bibliotheken. Aber allzu oft habe ich Leute gesehen, die zu weit auf dem Weg der Vorlagen-Metaprogrammierung waren, und ihre Programme leiden darunter. Ich bin nicht gegen Metaprogrammierung, in der Tat bin ich ein starker Befürworter dafür, es ist nur so, dass die Möglichkeiten von C ++ dafür ziemlich grob sind.
Anton I. Sipos
2

Das beste Buch zum Lernen von C ++. "Accelerated C ++" von Koenig & Moo lehrt, was Sie als modernes C ++ bezeichnen. Ich denke, die meisten Leute verwenden es heutzutage. Für diejenigen von uns, die C ++ schon eine ganze Weile verwenden (in meinem Fall seit Mitte der 80er Jahre), ist modernes C ++ eine große Erleichterung von den mühsamen Aufgaben, eigene Arrays, Strings und Hash-Tabellen zu schreiben (Wiederholung ad nauseam).

anon
quelle
1
Ich will nicht nekrotisch sein, aber ich habe das Buch aufgrund dieser Empfehlung gekauft. Wir müssen sehen!
Andrew Weir
2

Ich habe mir tatsächlich C ++ - Jobs angeschaut und "moderne" Bibliotheken werden immer häufiger in Jobbeschreibungen verwendet. MFC, eine ziemlich "alte" C ++ - Bibliothek, wird weniger verwendet.

Rexxar
quelle
1

Die Standardisierung der Sprache Ende der neunziger Jahre war der erste Schritt. Sie ermöglichte es den Compilerherstellern, sich auf die "Standard" -Funktionen zu konzentrieren, und ermöglichte es der Sprache, einige der rauen Kanten zu korrigieren, die während des Standardisierungsprozesses auftraten.

Dies ermöglichte wiederum die Entwicklung von Frameworks basierend auf Standardfunktionen der Sprache und nicht auf Funktionen, die von einer bestimmten Compiler-Implementierung bereitgestellt wurden. Die Boost-Bibliothek ist in dieser Hinsicht besonders wichtig. Dies ermöglichte auch, dass die Neuentwicklung auf früheren Arbeiten basiert und somit Lösungen für komplexere Probleme ermöglicht.

Eine bemerkenswerte Änderung ist hier, wie frühere Frameworks auf dem Begriff der Basisklassen und abgeleiteten Klassen basierten (eine Laufzeitfunktion). Die meisten erweiterten Funktionen basieren jedoch häufig stark auf "rekursiven" Vorlagen (eine Funktion zur Kompilierungszeit).

Die STL hat ihre Vor- und Nachteile, aber sie hat den Test der Zeit überstanden, wenn Sie etwas wollen, das funktioniert und einfach ist. Die STL hat sicherlich etwas, das Ihnen beim Start hilft. Es macht keinen Sinn, das Rad neu zu erfinden (außer aus didaktischen Gründen).

Computerhardware hat seit den 1990er Jahren ebenfalls große Sprünge gemacht, dann sind Speicher und CPU keine Einschränkung mehr für den Compiler. Die meisten theoretischen Optimierungen aus Büchern sind nun möglich.

Die nächsten Schritte der Sprache sind die Unterstützung der Multi-Core-Programmierung, die Teil des 0x-Standardaufwands ist.

Ismael
quelle
1

Ja und nein. Sicherlich wird es für neue Projekte immer beliebter. Es gibt jedoch immer noch Hindernisse für die Adoption, die praktisch und nicht politisch sind und die andere nicht erwähnt haben. Es gibt viele kommerzielle C ++ - Bibliotheken, die ABIs von alten Compilern verwenden, die die in Modern C ++ gezeigten Funktionen nicht richtig unterstützen, und viele Unternehmen verlassen sich auf diese Bibliotheken. Sun Studio unter Solaris kann beispielsweise ohne die Verwendung von STLport nicht mit Boost arbeiten. Für jede kommerzielle Bibliothek eines Drittanbieters, die Sie verwenden möchten, ist jedoch die Sun-Version der STL erforderlich. Gleiche Geschichte mit GCC 2.95 und Redhat Enterprise Linux.

Joseph Garvin
quelle
-3

Es ist erstaunlich, wie wenig Aufwand erforderlich ist, um c ++ stabiler zu machen. Das Warnsystem ist vorhanden, aber es entwickelt sich nicht viel weiter. Es ist noch einfacher, sich in einen Fuß zu schießen als vor 10 Jahren. Ich weiß nicht warum, aber C ++ ist immer noch meine Lieblingssprache. :) :)

AareP
quelle
Ich würde vorschlagen, einige der Bücher in diesem Thread zu lesen, bevor Sie behaupten, dass "wenig Aufwand" in die C ++ - Stabilisierung gesteckt wird und dass "es noch einfacher ist, sich in einen Fuß zu schießen als vor 10 Jahren".
Patrick Niedzielski
Sicher, die Standardbibliothek bietet eine gewisse Stabilität hinsichtlich der Speicherzuweisung und der Manipulation von Zeichenfolgen. Leider verwendet es intern so seltsame Codierungskonventionen, dass man denken würde, es wurde von Außerirdischen oder so geschrieben. :)
AareP
2
Da es sich bei der Standardbibliothek um eine Spezifikation handelt, beschuldigen Sie Ihren Compilerhersteller, seltsame interne Codierungskonventionen verwendet zu haben. Und außerdem sind seltsame Codierungskonventionen = / = instabil oder einfacher, sich in den Fuß zu schießen. Die meisten dieser Codierungskonventionen (zumindest über die MSVC-Bibliothek und wahrscheinlich auch über andere) sind so konzipiert, dass sie Sie überhaupt nicht stören, sodass Sie dumme Dinge tun können und die Bibliothek sich nicht darum kümmern muss. Wenn Sie außerhalb der C ++ - Spezifikation codieren, ist das etwas anderes.
Patrick Niedzielski
Beachten Sie, dass eine typische STL-Implementierung (insbesondere wenn sie mit einem bestimmten Compiler gebündelt ist) nicht Standard C ++ verwenden muss, um sich selbst zu implementieren. Es kann sehr gut implementierungsspezifisches Wissen in sich nutzen, um Ihrem Code die vom Standard versprochenen Garantien zu geben. Ihr eigener Code sollte sich jedoch nur an die Garantien des Standards halten. Sie können die Standardgarantien nicht lernen, indem Sie eine bestimmte C ++ - oder STL-Implementierung untersuchen.
Tanz87
Diese Antwort wurde vor einem Jahrzehnt geschrieben. Zu dieser Zeit war es erstaunlich , wie viel Mühe in der Herstellung c ausgeübt wurde ++ mehr stabil. Dies war einer der Hauptgründe dafür, dass die Veröffentlichung von c ++ 0x als c ++ 11 so lange gedauert hat.
David Hammen