C ++ für C # -Entwickler

24

Ich kenne C # ziemlich gut (leider autodidaktisch) und muss für eine Windows-Anwendung etwas C ++ programmieren. Ich konnte eine Menge Informationen für C ++ - Entwickler finden, die C # gelernt haben, aber ich konnte nicht viel zum Erlernen von C ++ finden, wenn Sie C # bereits kennen. Hat jemand einen guten Überblick über die Grundlagen gefunden?

MSDN hat einen Vergleich, der jedoch nicht sehr ausführlich ist.

Ich kann mehrere Quellen zusammenfügen, habe aber herausgefunden, dass etwas da draußen ist - ich kann es einfach nicht finden. Danke für Ihre Hilfe.

Mark Williams
quelle
27
Warum "traurig"? Leg dich nicht so hin. Ich kenne keinen C # -Entwickler, der nicht Autodidakt ist. Viele davon sind großartige Entwickler.
Steven Evers
6
@SnOrfus - hauptsächlich, weil die Wissenschaft es aus irrationalen pseudopolitischen Gründen meidet.
Rei Miyasaka
5
Mein erster Ratschlag ist, C ++ nicht im Kontext von C # zu lernen. Weil C # nicht C ++ und C ++ nicht C # ist. Das mag eine dumme Aussage sein, aber C # macht es schwierig, Zeiger falsch zu machen, und es ist sehr einfach, sie in C ++ falsch zu machen, selbst mit den Tools, die es relativ einfach machen. Ich würde hinzufügen, dass es viele Dinge gibt, die beide Sprachen gemeinsam haben. Es ist im Grunde so, als ob man sagt, ein Apfel und eine Orange sind beide auf einem Baum gewachsen und haben Samen und somit sind sie Früchte.
Ramhound
2
@ReiMiyasaka, ähnlich wie C # -Entwickler VB .NET betrachten.
Kyralessa
1
@Kyralessa Was auch irgendwie bedauerlich ist. Ich denke, es ist nicht so sehr ein politisches Problem, sondern eine Herablassung gegenüber der VB.NET-Demografie - da die meisten C # -Frühanwender einen C / C ++ - Hintergrund haben. Meine Schule verwendete VB.NET jedoch für Anfängerkurse. Sie scheinen zu glauben, dass VB.NET ein Spielzeug ist, und sollten daher den Verstand der Schüler nicht so verfälschen wie C #.
Rei Miyasaka

Antworten:

10

Dieser Thread für C ++ für Java-Entwickler ist sehr ähnlich und sollte nützlich sein, insbesondere Mark Byers Beitrag:

Lesen Sie diese Bücher:

Am wichtigsten ist es wahrscheinlich , den Unterschied zwischen den Speicherverwaltungstechniken in C # / Java und C ++ zu verstehen .

Einer meiner Profis hatte einen Java-Hintergrund und unterrichtete einen Einführungskurs in C ++. Nichts, was er erklärte, ergab für irgendjemanden einen Sinn. Er hatte überall Speicherlecks gehabt. Seine Zeigerarithmetik war schrecklich. Er kam nie zum OOP-Teil des Lehrplans (Gott sei Dank). Praktisch nichts, was er demonstrierte, hätte zusammengestellt. Er verstand nicht, dass char[]ein Wachposten nötig war \0. Nicht wie er enden.

Rei Miyasaka
quelle
4
Schade , dass niemand in C ++ verwendet char[]dann ist es nicht?
DeadMG
5
@DeadMG Ich kann Ihren Standpunkt nicht ganz verstehen. Nur weil char[]es in C ++ selten verwendet wird, heißt das nicht, dass es nicht unterrichtet wird oder dass es nicht unterrichtet werden sollte. char[]Es ist immer noch wichtig, sich dessen bewusst zu sein, weil C ++ eine Obermenge von C ist, und es ist unerlässlich, dass es richtig verstanden wird, wenn es überhaupt gelernt werden soll.
Rei Miyasaka
7
Ja, eine sehr, sehr lange Zeit, nachdem sie alle anderen Aspekte der Sprache gemeistert haben. Ich würde lieber neuen Schülern Teilschablonenspezialisierungen und SFINAE beibringen. In C ++ verwenden Sie std::string, und wenn Sie mit einer C-API interagieren müssen, ist dies der Grund c_str()dafür. Es besteht keine Notwendigkeit für den Programmierer, sich damit zu befassen char[]oder NULL zu beenden. Das String-Handling im C-Stil ist für jede mögliche Verwendung völlig veraltet, mit Ausnahme der Interoperabilität mit altem C-Code, der perfekt gehandhabt wird c_str().
DeadMG
4
Es gibt kein char[]richtiges Unterrichten , weil alle Verwendungen von char[]falsch sind. Ihr Professor wäre wahrscheinlich vollkommen in Ordnung gewesen, wenn er sich an C ++ anstatt an C gehalten hätte.
DeadMG
4
Sie werden sehen , C - Code in C ++ verwendet , ob Sie C schreiben oder nicht sich selbst, und folgerichtig , wenn Sie C ++ sind Lernen Sie C. Wie ich gesagt habe lernen müssen, ich nicht dulden, aber die Tatsache , dass die Sache ist , dass Schulen im allgemeinen C und dann tack auf C ++ lehren später, weil die Schüler Dinge wie OS Design gelehrt werden müssen - was, BeOS und bestimmte Forschungs OSes ohne, absolut C. Dafür benötigen Sie tun müssen C - Strings zu verstehen. Auch hier zum dritten Mal, wenn es nach mir ginge, würde ich nicht C überhaupt erstes Jahr Studenten lehrt ++, und zum letzten Mal, das ist völlig nebensächlich.
Rei Miyasaka
14

Leider ist an C ++ nicht viel Grundlegendes zu beachten, sodass ich Ihre Hoffnungen nicht in die Höhe treiben würde. Darüber hinaus wissen Sie nur wenig über C #, das sogar remote auf C ++ übertragbar ist. Daher würde ich nicht erwarten, dass es ein bestimmtes Material für diesen Winkel gibt. Sie müssen von Grund auf lernen.

DeadMG
quelle
3
Das würde erklären, warum es da draußen nicht viel gibt. Nachdem Sie ein bisschen in C ++ nachgelesen haben, scheint es, als ob Sie richtig liegen - es ist eine völlig andere Welt. Danke für Ihre Hilfe.
Mark Williams
1
+1, Sie wissen nur wenig über C #, das sogar remote auf C ++ übertragbar ist . Ich habe das auf die harte Tour gelernt.
ApprenticeHacker
Um es kurz zu machen, ich würde sagen, es gibt eine Menge von C ++, die grundlegend sind. Das Unterscheiden von Zeigern / Referenzen und C ++ - Vorlagen kann Ihren Kopf zunächst drehen, aber wenn es darauf ankommt, gibt es immer noch Klassen coutund einfache Wege, um einfache Ziele zu erreichen
Kieren Johnstone
1
@KierenJohnstone: Du meinst wahrscheinlich "langsame und ausnahmesichere Methoden, um Dinge zu tun", wie "Array-zu-Zeiger-Zerfall" und solche Dinge.
DeadMG
12
Nette völlig hilflose Antwort.
Dbracey
9

Es gibt keine einfache Lösung dafür, C ++ ist nicht besonders schwierig, aber für Anfänger nicht einfach.

Ich würde empfehlen, sich mit den Grundlagen der C-Programmierung vertraut zu machen (um einen Überblick über die Dinge auf niedrigem Niveau zu erhalten) und dann die STL zu lernen, gefolgt von Artikeln von Leuten wie Scott Meyers. Hier ist eine Einführung, die zeigt, wie Sie modernes C ++ im Vergleich zu C-with-classes schreiben sollten.

gbjbaanb
quelle
2
+1: Ich würde hinzufügen, Meyers Bücher zu bekommen (effektive C ++ / STL-Serie). Ich habe sie alle und sie sind fantastisch.
Steven Evers
12
-1 für reading up on C programming. Ich denke, das schadet mehr als es nützt und vertritt die Auffassung, dass C und C ++ Sprachen sind, die zusammen gelernt werden müssen.
Sebastiangeiger
2
@sebastiangeiger: Sie verpassen den Punkt, dass Sie sich am häufigsten mit C-ähnlichen Konstrukten befassen müssen, wenn Sie mit vorhandenen realen C ++ - Anwendungen arbeiten müssen. Daher +1, um zumindest Ihre Ablehnung zu beseitigen.
Doc Brown
5
@DocBrown Vielleicht, aber ich bin gerade in einem dieser C ++ Legacy-Projekte und ich kann sagen, dass meine Vorgänger größtenteils nur C-Programmierer waren, die ihre Quelldateien als * .cpp gespeichert haben. Ich habe festgestellt, dass ich viel weniger deleteC-Arrays und andere Dinge verwende, von denen in C ++ abgeraten wird, als sie es taten. Ich schreibe dies NICHT explizit auf C. C ist relativ einfach, Sie können ziemlich schnell herausfinden, was der Code tut.
Sebastiangeiger
3
@ gbjaanb: Es gibt überhaupt nichts über die STL, das es erfordert, zu wissen mallocund free. Ein großartiger C ++ - Entwickler wird irgendwann etwas über sie wissen wollen. Mit ihnen anzufangen ist eine ganz andere Sache.
DeadMG
7

Ich bin mir nicht sicher, ob Sie noch nach Materialien suchen. Ich habe diesen Artikel vor ein paar Monaten gefunden. Es ist kein Buch (nur 53 Seiten). Die Einführung sagt alles:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithblogs.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

Und es gibt auch einen Update-Beitrag:

http://geekswithblogs.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

Viel Spaß beim Lernen :)

Chris
quelle
Seien Sie jedoch sehr vorsichtig, wenn Sie dieses Dokument verwenden. Es zeigt C ++ auf eine sehr Microsoft-zentrierte Art und Weise (wie es auch heißt). Es unterscheidet nicht zwischen C ++ 03- und C ++ 11-Funktionen und zeigt manchmal sogar nicht standardmäßige Erweiterungen als bevorzugte Lösung an. Wenn Sie diese Anleitung befolgen, werden Sie höchst unportablen Code erhalten.
Fabio Fracassi
4
  • Achten Sie auf die Speicherverwaltung. Machen Sie sich ein klares Bild darüber, wie Zeiger und Verweise in C ++ im Gegensatz zu C # funktionieren. Auch RAII, manuelle Speicherverwaltung und Smart Pointer endlich.
  • Vorlagen und Generika sehen ähnlich aus, sind aber unterschiedliche Bestien. Kennen Sie die Interna der Funktionsweise von Vorlagen.
  • Es gibt einige kleine, aber eingängige syntaktische Unterschiede. Lerne sie.
  • Sie haben sich an STL anstatt an .net BCL gewöhnt. Sie werden vielleicht ein paar gute Dinge verpassen, wenn Sie von LINQ abhängig sind.
  • Es gibt einige grundlegende Designunterschiede zwischen C ++ und C #. Sie können also nicht einfach eine Idee portieren. Alles, was Sie mit C ++ erstellen, müssen Sie von Grund auf neu entwerfen.
  • Viel Glück
Gulshan
quelle
1

Ich finde es gut, dass Sie nicht zu viele C # - bis C ++ - Tutorials finden. Sie können wahrscheinlich Ihr Gehirn durcheinander bringen. Es ist fast so, als würde man zuerst lernen, Motorrad zu fahren und dann auf ein Fahrrad umzusteigen (keine ganz angemessene Anologie, aber man bekommt die Idee). Es ist besser für Sie, ein neues Buch über C ++ zu nehmen. Da Sie bereits mit den OOP-Konzepten vertraut sind, können Sie entweder die langen Einführungen in die OOP-Konzepte überspringen (sie sind für Benutzer gedacht, die von C nach C ++ migrieren). Oder suchen Sie direkt nach einem Nachschlagewerk für Anfänger bis Fortgeschrittene oder Fortgeschrittene.

DPD
quelle
1

Ich würde empfehlen, zu Rosetta Code zu gehen und die beiden zu vergleichen. Während Sie dort sind, halten Sie einen Link mit C ++ - Redewendungen bereit und versuchen Sie, diese zu finden. Verbringen Sie dann einige Zeit im Bereich Zeiger / Referenz / Speicher / Destruktor. Danach lernen Sie den Präprozessor kennen - er kann wirklich Ihr Freund sein, wenn es darum geht, die Hässlichen zu verstecken, ich vermisse ihn irgendwie. Schließlich ist die STL.

Kennzeichen
quelle
1

Vor ungefähr einem Jahr saß ich also im selben Boot wie Sie: Autodidakt C # Dev, der das Bedürfnis verspürte, C ++ zu lernen. Zugegeben, ich habe mehrmals angehalten und angefangen. Bei meinem dritten Versuch habe ich es endlich geschafft.

Was unbedingt zu verstehen ist, ist, dass Sie in Bezug auf C ++ - und C # -Methoden wahrscheinlich viel Zeit damit verbringen werden, zu verstehen, welche Datenbearbeitungsmethoden durch Zeiger und Verweise tatsächlich verwendet werden bedeuten und wann und wie sie unter den gegebenen Umständen verwendet werden.

Das Schöne an C ++ ist, dass die Objektstapelzuweisung zum größten Teil recht einfach ist. Sie sollten Objekte auf diese Weise zuweisen, wenn Ihr Programm die unter dieser Methode angegebenen Anforderungen erfüllt. Andernfalls verlassen Sie sich auf Hinweise für Geschwindigkeit, Effizienz und schnelle Bereinigung. Ich empfehle dies zu lesen: http://www.parashift.com/c++-faq-lite/ da es Ihnen eine Menge technisches Verständnis darüber gibt, wie C ++ unter der Haube funktioniert.

Lassen Sie mich Ihnen ein Beispiel geben:

In C ++ gibt es diese Konstruktorimplementierung, die als "Initialisierungsliste" bezeichnet wird und sich von der Initialisierung von Klassenmitgliedern im Rumpf eines Konstruktors unterscheidet. Warum? Denn wenn der zu initialisierende Typ nicht primitiv ist, erstellt der Compiler tatsächlich mehrere und unnötige Kopien des Objekts, das beim Zuweisen im Hauptteil des Ctors erstellt wird. Dies kann je nach Compiler und den skalierten Anforderungen der App zu Leistungseinbußen führen.

Wissen Sie, was ein Delegierter ist? Nun, in C ++ ist es als Funktionszeiger bekannt . Diese Sprache ist anfangs ziemlich schwer zu beherrschen, aber wenn du großartig sein willst ... ist es definitiv erforderlich.

C # ist einfach ... sehr einfach.

etwa leer
quelle
C # -Delegierte und C-Funktionszeiger sind sehr unterschiedlich. Ein Delegat ist näher an einem Funktor in C ++ als an einem Funktionszeiger.
CodesInChaos
-2

Glauben Sie mir, wählen Sie ein gutes Buch über C ++ (es gibt noch viel mehr, machen Sie einfach eine Suche) und beginnen Sie zu lernen ...

Muhammad Hewedy
quelle
1
Übrigens, einige C vor (Zeiger, Arrays, struct) lernen wird gut sein
Muhammad Hewedy
7
Wenn Sie C vor C ++ lernen, werden Sie in die Steinzeit zurückversetzt. Heutzutage verwenden wir in C ++ sehr selten Arrays und Zeiger. Die Sprache hat sich vor langer Zeit von ihnen entfernt.
Fredoverflow
7
@ Muhammad: Alle anderen bevorzugen Geschwindigkeit, Sicherheit und Wartungsfreundlichkeit.
DeadMG
3
@DPD: Nun, viele professionelle C ++ - Programmierer, einschließlich Bjarne Stroustrup (der Erfinder der Sprache), sind anderer Meinung. In seinem neuesten Buch wird die Verwendung von Objekten und Vorlagen von Anfang an gelehrt, während über Arrays und Zeiger vor Kapitel 17 (Seite 500 und so weiter) überhaupt nicht gesprochen wird.
Fredoverflow
2
@DeadMG. Vielleicht, aber Sie können die C-> C ++ - Evolution nicht rückgängig machen. Wenn Sie den C-Teil von C ++ hassen, entscheiden Sie sich für Java oder C #. Persönlich habe ich festgestellt, dass die Konzentration auf Zeiger und Arrays in C, bevor ich zu C ++ ging, mir in meiner Karriere sehr geholfen hat. Sicher, Sie können eine ganze Anwendung ohne sie codieren, aber wenn Sie die Vorteile des Polymorphismus nutzen möchten, müssen Sie Zeiger kennen. Wie viele der wichtigen GoF-Muster können ohne Zeiger implementiert werden? Es war nicht dasselbe für meine Freunde, die die "harten" Teile vermieden, als sie C studierten. Den meisten fiel es schwer, Polymorphismus zu verstehen.
DPD