Frage

Ich brauche C ++ zu lernen, um zu lernen, den Aufbau Nokia WRT und oder Maemo Anwendung. Ich muss wissen, was gotchas und was Aspekt von C ++, dass ich / haben, um mehr zu lernen oder zu fokussieren. Eine Sache, die ich in meinem Kopf habe, ist, dass C ++ nicht Garbage Collector hat. Dafür muss ich auf Variablentyp konzentrieren. Aber es gibt andere, die wirklich wichtig, und ich kann es nicht ignorieren?

War es hilfreich?

Lösung

Haupt Gotcha ist vorstellbar C ++ in Bezug auf versuchen, wie es sich von PHP oder Java.

Sorry, es funktioniert einfach nicht so. C ++ unterscheidet sich von diesen Sprachen in fast jedem wichtigen Punkt über die Syntax für die Arithmetik. Manchmal sind die Unterschiede subtil. Sie müssen es frisch lernen, und nicht, dass etwas denken, die in PHP oder Java angemessen ist für Sie zu tun in C ++ gut funktionieren wird.

sagte, dass gemeinsame Schwierigkeiten sind:

  • Ressourcenmanagement: RAH; Umsetzung Kopierkonstruktoren, Destruktoren und operator=; Vermeiden mit Kopie ctors, dtors, Operator =.
  • implementieren
  • zu verstehen, was Referenzen, Zeiger, Werte und automatische Variablen sind.
  • Vermeidung von undefinierten Verhalten (myarray[i] = i++; ist ein Favorit). PHP und Java sind beide mehr „dicht“ definierten Sprachen als C ++: erstens das Verhalten eines Programms ist wahrscheinlicher, definiert werden und somit zuverlässig. Aus diesem Grund, getrennte Implementierungen ähnlicher sind als C ++ Implementierungen. Es ist ziemlich einfach, ein Programm in C ++ zu schreiben, die nur die falsche Sache nicht tun, tut es völlig unterschiedliche Dinge auf verschiedenen Läufen, darunter abstürzt, korrumpiert Daten, etc.
  • Lernen sicher und effektiv Vorlagen verwenden, Mehrfachvererbung, Überladen von Operatoren und andere Funktionen, die Sie nicht kennen.
  • korrekte Idiome für das Werfen und Fangen Ausnahmen (Wurf von Wert, fang Bezug genommen wird, nicht wirft einen destructor out).
  • portablen Code zu schreiben (das Verständnis der Unterschied zwischen dem, was die Standard garantiert, und was nicht garantiert ist, sondern dass Ihre Implementierung geschieht zu tun. Implementierung definiert Verhalten wie die Größen der Grundtypen).
  • C ++ 's Standardbibliotheken sind begrenzt im Vergleich zu Java oder PHP. Sie werden auch mit Nicht-Standard-Bibliotheken sein. Zum Beispiel verwendet Maemo GTK + und / oder Qt. Oft ist die Antwort auf „Wie kann ich X in C ++“ ist, „kann man es nicht nur Standard C ++ verwenden, können Sie plattformspezifischen APIs oder eine tragbare Bibliothek für Ihr System zusammengestellt müssen“. X können Grafiken, Steckdosen, reguläre Ausdrücke, Multi-Threading, XML Handling, Krypto sein. Gerade bei mobilen Plattformen müssen Sie auf OS-Versionen im Auge behalten, können die Dinge und werden von Zeit zu Zeit unter Ihnen ändern.

Andere Tipps

Lernen Sie, Verwendung STL-Container sofort. Während die Iterator Syntax nicht freundlich für Menschen aus anderen Sprachen kommen, gibt es Ihnen die eingebauten Datenstrukturen, dass Sie in der Regel in Java Sammlungen oder PHP als builtin verwenden, (Karten / Hashes, Listen, Stacks, Vektoren) ohne flippigen Zeiger Code schreiben mit dem dynamischen Zuordnung ablenkt, dass so oft Anfänger in das Rad neu zu erfinden und mit Memory-Bugs Unordnung.

Auch wenn Sie plattformspezifischen Code (eine Qt oder Microsoft MFC-Anwendung, zum Beispiel) schreiben werden Sie oft Beispiele siehe Rahmen bestimmte Container mit denen die STL eine klügere Wahl sein würde. STL (und Boost) können in Lücken füllen. Die Verwendung eines GUI-Framework bedeutet nicht, Sie haben alles, was zu verwenden, den Rahmen bietet. Halten Sie sich von Nicht-Standard-Container entfernt, wenn Sie ohne einen Schatten des Zweifels wissen Sie nie Port das Programm oder die Wiederverwendung Teile des Codes.

Ich würde sagen, es ist nicht Variablentyp, so viel wie dafür, dass Sie Ihr Gedächtnis aufzuräumen. Java wird Ihr Gedächtnis aufzuräumen, aber C ++ wird es nicht für Sie. Andernfalls Ihre Ressourcen in Gegenwart von Ausnahmen Verwaltung ist wichtig.

Auf der positiven Seite, Sie gehen zu bekommen, was sie als „deterministische Finalisierung.“ Großer Vorteil. Nachschlagen, als Akronym „RAH“. Ich denke, es ist wohl eine der wichtigsten Idiome in C ++.

Es steht für „Ressourcen Acquisition Is Initialization“, aber es ist wirklich, was bedeutet, „Wenn diese destructor Feuer, werde ich nach Ihnen aufzuräumen, auch in Gegenwart von Ausnahmen.“ In der Praxis bedeutet es, jedes Objekt, das Sie erstellen, oder öffnen Sie, dass Sie schließen oder löschen müssen, können Sie einen Smart-Pointer halten verwenden. Der Smart-Pointer wird, nachdem Sie aufzuräumen. Das ist sehr, sehr mächtig, wenn Sie es verstehen und zu verwenden beginnen. Es macht Ihre Fehlerprüfung, Ausnahmebehandlung und Ressourcenbereinigungscode sehr einfach.

Ein Gotcha ich einige Java-Programmierer gesehen habe, wenn Übergang zu C ++ ist „try-catch“ Speicherlecks. Zum Beispiel:

try {
  myType pVar = new myType();
  DoSomething(pVar);
  delete pVar;
}
catch (exception) {
  cout << "Doh!  Something failed!" << endl;
}

Im obigen Fall, wenn der „DoSomething () -Methode eine Ausnahme auslöst, würde die pVar nie gelöscht werden, so wäre es ein Speicherverlust sein.

(Lösungen hierfür sind: alle Variablen vor try / catch-Blöcke deklarieren, mit auto_ptr, oder einfach nur vermeiden try-catch zu beginnen)

Das Wichtigste (meiner Meinung nach) ist, dass alles, was ein Werttyp ist, also, wenn Sie ein Array in eine Funktion wie folgt übergeben:

void do_stuff(std::vector<int> my_array)
{
  ...
}

dann die my_array, die in einer übergeben wird kopieren der das Argument angegeben. Kopieren eines gesamten Arrays, wie das ist teuer, so dass in der Regel wollen Sie von const-Referenz zu übergeben:

void do_stuff(const std::vector<int>& my_array) 
{
  ...
}

(Hinweis: lassen Sie die const wenn Sie das Original my_array ändern möchten).

Ich bin neugierig, warum PHP / Java "als eine einzige Sache hier angesehen wird. Es ist nicht.

  • Die Java-> C ++ Übergang ziemlich groß ist, aber es ist machbar, man muss nur eine Menge zusätzlicher Syntax lernen muß, ein paar zusätzlichen Konzepte wie Destruktoren Kopierkonstruktoren, Objekt Slicing und Betreiber Überlastung und damit abfinden die C ++ Bibliothek.
  • Die PHP-> C ++ Übergang auf der anderen Seite ist eine andere Größenordnung größer, als es sich um (a) einen sehr schlecht definierte Ausgangssprache, (b) eine Sprache, die eher schablonenbasierten als klassenbasierte, und (c) eine Sprache, die ausführt, in einer speziellen Umgebung.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top