Was muss ich über C ++ wissen? [geschlossen]

8

Ich habe vor kurzem angefangen, C ++ zu lernen, und es macht mir sehr viel Spaß.

Ich habe oft gelesen, dass es einfacher ist, schlechten Code in C ++ zu schreiben als in den meisten anderen Sprachen, und dass er viel tiefer geht, als es scheint.

Da ich vermeiden möchte, schlechten Code zu schreiben, habe ich mich gefragt, was genau ich nicht tun soll und was ich tun soll, um guten Code in C ++ zu schreiben.

DistantEcho
quelle
1
Welche C ++ - Bücher haben Sie gelesen oder lesen Sie?
Fred Nurk
Noch keine. Ich habe auch nach guten Büchern gesucht, aber ich habe zu viele gefunden und weiß jetzt nicht, wo ich anfangen soll ( stackoverflow.com/questions/388242/… )
DistantEcho
Verwechseln Sie sich nicht mit Büchern, ich empfehle entweder Robert Lafore ( amazon.com/Object-Oriented-Programming-4th-Robert-Lafore/dp/… ) oder C ++ Premier ( amazon.com/dp/0201721481/?tag=) stackoverfl08-20 ) Wenn Sie mehr Code schreiben, werden Sie selbst erfahren, was Sie vermeiden sollten. Da Sie nicht viel über C ++ wissen, glaube ich nicht, dass Sie (praktisch) verstehen können, was in den Antworten hier zu vermeiden ist.
Ranger
3
Wenn das einzige Werkzeug in Ihrer Toolbox C ++ ist, sieht alles wie ein Daumen aus ...
CurtisHx

Antworten:

21

Die Fallstricke

Es gibt so viele Fallstricke in C ++, dass Sie, wenn Sie sie nicht kennen, sehr instabilen Code mit Tonnen von Speicherlecks und Pufferüberläufen erstellen. Im Vergleich zu moderneren Sprachen mit Garbage Collection müssen Sie den gesamten Speicher selbst freigeben. Außerdem ist der Code sehr niedrig. Nichts hindert Sie daran, Ihren eigenen Programmcode zu überschreiben (der von vielen IE-Hacks ausgenutzt wurde).

Das nächste, was Sie lernen müssen, sind die Programmierpraktiken, die diese Risiken mindern, z. B. die Verwendung intelligenter Zeiger zum Behandeln von Freigabeobjekten, das Umschließen von Bytearrays in Klassen, die mit den Daten umgehen, usw.

Ich kann Scott Meyers 'Bücher "Effective C ++" und "More Effective C ++" empfehlen .

Diese Bücher haben mir im Wesentlichen die Schönheit von C ++ beigebracht. Beachten Sie, dass dies keine Anfängerbücher sind. Sie setzen voraus, dass Sie mit der Sprache bereits vertraut sind.

Pete
quelle
4
"Accelerated C ++" von Koenig und Moo ist ein gutes Buch für neue C ++ - Programmierer, da es Vorlagen und Klassen einführte, indem zuerst Anwendungsbeispiele, dann Design und Erstellung gezeigt wurden. Ich fand es einfacher zu verstehen, warum man sie mit diesem Ansatz verwendet.
Larry Coleman
Ich habe angefangen, Effective C ++ zu lesen, und es hilft wirklich sehr. Vielen Dank !
DistantEcho
2
" Nichts hindert Sie daran, Ihren eigenen Programmcode zu überschreiben " Huh? Was? Dies ist nicht die Schuld der Sprache - in der Tat ist dies in den meisten Betriebssystemen nur möglich, wenn Sie aktiv Maßnahmen ergreifen, um dies zu ermöglichen. Und schlecht geschriebene Programme können möglicherweise ausgenutzt werden, unabhängig von der Sprache, in der sie geschrieben sind. Ja, C ++ ist auf niedrigem Niveau und hat seine Fehler, aber lassen Sie uns mit so einem Unsinn nicht über Bord gehen.
Nik Bougalis
@NikBougalis Das Betriebssystem verhindert dies - in Fällen, in denen das Betriebssystem dies verhindert -, aber C / C ++ bietet Ihnen standardmäßig eine Methode, um dies zu tun, in Fällen, in denen das Betriebssystem dies nicht verhindert. während viele andere Sprachen dies nicht tun. Es ist also kein Unsinn, dies als Sprachproblem zu bezeichnen - aber ich stimme zu, dass der ursprüngliche Punkt eher übertrieben ist.
Greggo
5
@greggo ist es Unsinn - man kann sich auch beschweren, dass eine Kaffeetasse Sie nicht davor schützt, versehentlich Salz in Ihren Kaffee zu gießen. Tatsache ist: C und C ++ wissen nichts über Ihr Programm oder das System, auf dem es ausgeführt wird. Die Sprache konnte unmöglich das Problem "zomg! Mein Programm wurde überschrieben" ansprechen, ohne dass wir zuerst die zugrunde liegenden Annahmen, auf denen die Sprache basiert, grundlegend geändert haben.
Nik Bougalis
20

Redewendungen

C ++ unterstützt eine Vielzahl von Funktionen. Ebenso kann man leicht versucht sein, es auf viele verschiedene Arten oder Stile zu verwenden. Leider passt es vielen von ihnen nicht gut - und wird daher auf diese Weise langweilig, fehleranfällig oder langsam.

Oder anders formuliert, ohne wirklich zu wissen, was Sie tun, ist es unglaublich einfach, C ++ falsch zu verwenden (was in anderen Sprachen viel besser unterstützt würde). Einfaches Lernen durch Handeln kann daher in eine falsche Richtung führen. Daher ist das Lesen guter Bücher wahrscheinlich wichtiger als in anderen Sprachen (siehe diesen Beitrag zum gleichen Thema).

Java zum Beispiel ist eine von Natur aus objektorientierte Sprache. Viel anders kann man das nicht programmieren. In C ++ können Sie dies jedoch . Sie können es wie in C oder Java verwenden - und C ++ zeichnet sich auch nicht dadurch aus, dass Sie in diesen Fällen besser bei C oder Java bleiben sollten.

Daher müssen Sie wirklich den richtigen Stil und die richtigen Redewendungen kennen, um C ++ von Anfang an richtig zu machen. Leider können sie zunächst recht komplex sein, aber hier sind einige - von einfach bis fortgeschritten.

  • Verwenden const
  • Mach dir keine Sorgen über Mikrooptimierungen (sollte ich inlineeine Funktion haben, << oder *etc.?)
  • Verwenden Sie nach Möglichkeit (insbesondere void*) keine rohen Zeiger oder Arrays . Verwenden Sie Referenzen oder intelligente Zeiger
  • Generischen Code schreiben = Vorlagen verstehen
  • Header / Codedateien / Präprozessor verstehen (aber Makros vermeiden)
  • Verwenden Sie die STL (und verstehen Sie die zugrunde liegenden Konzepte)!
  • Verwenden Sie Boost
  • Machen Sie sich Gedanken über die Lebensdauer und den Umfang von Objekten - Verwalten Sie RAII
  • Schreiben Sie überhaupt keinen objektorientierten Code (dh viel Laufzeitpolymorphismus, Vererbung) - es gibt viel bessere OO-Sprachen
  • Verwenden Sie stattdessen Objekte
  • Bevorzugen Sie statischen Polymorphismus
  • Verwenden Sie Funktionen zur Kompilierungszeit
Dario
quelle
Danke für die Ratschläge. Ich verstehe nicht wirklich, warum ich es vermeiden sollte, objektorientierten Code zu schreiben. oder meinten Sie einige Teile von OOP speziell?
DistantEcho
1
OOP bedeutet nicht nur das Programmieren mit Objekten, sondern impliziert bestimmte Entwurfsmuster, Laufzeitpolymorphismus durch Vererbung, Klassenhierarchien ... C ++ ist nicht wirklich gut darin, diese auszudrücken - Sie benötigen (intelligente) Zeiger und häufig explizite Speicherverwaltung für Laufzeitpolymorphismus. Es ist relativ langsam und voller Fallstricke (haben Sie jemals einen virtuellen Destruktor vergessen?). Sie haben oft sauberere Möglichkeiten, dasselbe mit reinen Objekten auszudrücken, z. B. generische Programmierung / statischen Polymorphismus.
Dario
2
@Niphra: Es geht nicht darum, OOP nicht zu verwenden, es geht darum, sich nicht auf OOP zu beschränken. C ++ bietet mehrere Paradigmen, und gute C ++ - Programme verwenden die meisten, wenn nicht alle.
Matthieu M.
3
Keines davon ist eine Redewendung. Der OOP-Rat ist bestenfalls fragwürdig und scheint eher auf Angst als auf irgendeinem technischen Grund zu beruhen.
Edward Strange
"jemals einen virtuellen Destruktor vergessen". Ja - wichtig, um Compiler-Warnungen zu aktivieren. Eine andere: 'Funktion, die einen Wert zurückgibt, gibt möglicherweise keinen Wert zurück' - in einem Fall, in dem der zurückgegebene Wert einen Konstruktor erfordert. Kaboom. IMHO sollte diese Warnung standardmäßig aktiviert sein.
Greggo
13

Die Stärke von C ++ ist, dass es eine großartige Sprache ist. Der Nachteil von C ++ ist, dass es eine großartige Sprache ist. Es kann gleichzeitig schrecklich und schrecklich sein.

Wenn Sie es lernen möchten - und es gibt keinen Grund, warum Sie es nicht sollten - müssen Sie es gut lernen. Sie müssen viel lesen . Es gibt einige Bücher, die Ihnen auf Ihrem Weg helfen werden: Mit Accelerated C ++ können Sie loslegen, insbesondere wenn Sie die Übungen machen. Effective C ++, Effective STL, Exceptional C ++ und ihre fortlaufenden Serien gehören zu den besten im Spiel, um Tipps zur Verbesserung Ihrer Arbeitsweise zu erhalten.

Kaz Dragon
quelle
4

Ich denke, eine Sache, die auf Ihrem Weg zu gutem Code helfen wird, ist Erfahrung . Lassen Sie sich vorerst nur auf die Sprache ein und machen Sie sich nicht zu viele Gedanken über "Best Coding Practices", bis Sie sich damit vertraut gemacht haben, um nach Möglichkeiten zu suchen, Ihre Nutzung zu verbessern. Sie werden lernen zu erkennen, was gut und was schlecht ist. Sobald Sie die Sprache nicht mehr beherrschen, können Sie zurückblicken und denken: "Okay, ich hätte das anders implementieren sollen" oder "Das sieht chaotisch aus. Wie kann ich es verbessern?"

Ich denke so darüber nach : Wenn Sie eine neue gesprochene Sprache lernen, tauchen Sie nicht direkt ein und lernen jede einzelne grammatikalische Regel, bevor Sie anfangen, einfache Wörter zu lernen oder wie man sagt "Wo ist die Bushaltestelle?". Programmierung (IMO) ist wie eine zweite Sprache (oder dritte, vierte usw.). Behandle es wie jede andere Sprache und lerne dabei. Der Rest wird mit der Zeit kommen.

Dachsr
quelle
1

Ich habe oft gelesen, dass es einfacher ist, schlechten Code in C ++ zu schreiben als in den meisten anderen Sprachen, und dass er viel tiefer geht, als es scheint

Klarstellung: In C ++ ist es einfacher, ungewollt schlechten Code zu schreiben als in anderen Sprachen. Sie können schlechten Code in jeder Sprache schreiben, aber in C ++ machen Sie sich mit den besten Absichten auf den Weg, landen aber oft an einem unerwarteten Ort, weil C ++ - nachdem Sie von "Anfänger" zu "Fortgeschrittenen Anfänger" gewechselt sind, haben Sie den falschen Eindruck, dass C ++ einfacher ist als es tatsächlich ist. Aber C ++ entwickelt sich weiter und alle neuen Vorlagenbibliotheken machen Ihr Leben einfacher (und sicherer).

AndersK
quelle
2
Dies hängt auch davon ab, wie Sie C ++ lernen. Wenn Sie anfangen, es als erweitertes C zu lernen, werden Sie in diesem Stadium eher in Schwierigkeiten geraten, als wenn Sie es nur als C ++ lernen.
David Thornley
Zeit für das obligatorische Stroustrup-Zitat: "C macht es einfach, sich in den Fuß zu schießen; C ++ macht es schwieriger, aber wenn Sie es tun, bläst es Ihnen das ganze Bein ab"
Mawg sagt, Monica am
-1

Zwei Dinge:

  1. Wie funktioniert die Speicherverwaltung mit C ++?
  2. Wie wirken sich Zeiger auf die Speicherverwaltung in C ++ aus?
Rachel
quelle
1
Es ist viel mehr für C ++ als nur Speicher ...
Nazgob