S
knivil schrieb:
Die Unterschiede zw. C++ und Java fallen mir beim Programmieren nicht auf. Was mache ich falsch? koennt ihr Beispiele geben, wo man es in C++ grundsaetzlich anders implementiert als in Java?
Beispiele:
- Reflection
- value semantik
- RAII
Also ich stolpere immer wieder einmal über die unterschiedliche "Denke": Während in Java unglaublich viel in die Laufzeit verlegt wird, versucht man in (gutem) C++ möglichst viel zur Compilezeit entschieden zu haben. Das merkt man z.B. daran, dass explizites Casting in Java ganz normales Alltagsgeschäft ist ("Na dann fliegt halt eine bad-cast-exception"), während in C++ alle Alarmglocken schellen, wenn man mal explizit casten muss.
Wenn man (z.B. hier im Forum) mal schaut, was die typischen Fragen von "Komme-von-Java"-C++-Neueinsteigern ist, drehen sich 90% darum, dass sie
a) Reflection (bzw. allg. "Typbestimmung zur Laufzeit") gewohnt sind und das in C++ vermissen und/oder
b) mit der value semantik ("auto Objekte" im Gegensatz zu solchen, auf die mit Pointern/Referenzen verwiesen wird).
Des Weiteren habe ich den Eindruck, dass in der Javawelt der Fokus viel stärker auf dem einen Weg liegt. Da wird sehr stark auf Vorhandenem aufgebaut - überspitzt gesagt: Ein Javaprogramm ist nur ein Stückchen Konfiguration für eine Laufzeitumgebung, die dann die eigentliche Arbeit macht.
Vorteil: Mit überschaubarem Aufwand wird schnell was auf die Beine gestellt, was allgemein"verständlich" ist.
In C++ wird viel stärker an sehr speziell zugeschnittenen Lösungen gearbeitet. Das drückt sich auch in der größeren Vielfalt der Programmiermittel (OO UND Funktionen, Laufzeit- UND Compielzeitpolymorphie, high- UND lowlevel-Programmierung, ...).
Überspitzt gesagt: Für jeden Weg das Rad neu erfunden.
Vorteil: Klarer definierte und besser passende Programme und universellere Konzepte.
Wenn ich denn mal in die Javawelt eintauche, bin ich einerseits begeistert von all dem, was es schon gibt - andererseits verblüfft über die Vertrauensseligkeit.
Ein typischer Satz für einen C++-Programmierer: "Ich definiere meine Schnittstelle so, dass jeden Anwender sofort klar ist, was sie tut und er sie nur richtig verwenden kann." (und damit ist nicht der Funktionsname oder die Dokumentation gemeint)
Der Javaprogrammierer würde vllt. eher sagen: "Ich definiere meine Schnittstelle so, dass sie funktioniert und ich sie möglichst nicht mehr ändern muss."
Gruß,
Simon2.