@Artchi
DU sach mal, willst du uns hier Worte in den Mund legen, die wir eigentlich nicht gesagt haben?
Ja, genau das will ich, da ich hier auch schon die ganze Zeit (bewusst?) falsch verstanden und interpretiert werde. Das nervt nämlich wie du vielleicht jetzt festgestellt hast.
Tut mir leid wenn du dich jetzt allzusehr auf den Schlips getreten gefühlt hast.
Niemand sagt, das jemand 50 Jahre lang nicht erfahren soll, was ein Stack und Jump ist.
Und niemand sagt dass irgendwer Begriffe wie Pointer oder Callstack etc. lernen sollte bevor er ein Hello-World geschrieben und sich ein Bisschen darüber gefreut hat. Ich weiss auch nicht was ihr hier dauernd auf eurem "Hello World" rumreitet, "Hello World" ist weder high-level noch low-level, das ist Syntax mit 1-2 "weil printf/puts das eben macht" oben draufgestreut. Ich sage bloss bevor man mit dem ganzen Kram wie Vererbung, OO Techniken, STL etc. anfängt wäre ein wenig Basis nicht verkehrt. Bzw. meiner Meinung nach sogar notwendig. Für C++. Java/PHP/... etc. ist ein etwas anderer Schuh. Und dass in Java Tutorials/Kursen in Kapitel 1 oder 2 keine Zeiger vorkommen wird vermutlich daran liegen dass es in Java keine Zeiger gibt
Für den Anfang reicht es, wenn der Einsteiger weiß, das in bar foo augerufen wird. Ich muß den Anfänger nicht damit belasten, das ein CALL auf der CPU aufgerufen wird und notfalls auf dem CPU-Stack eine Rücksprungadresse vermerkt wird.
Das sind technische Details, das braucht niemand gleich zu wissen, da gebe ich dir Recht. Aber was "aufrufen" in C++ bedeutet sollte man wissen, oder? Erklär das mal jmd. der von Programmieren genau 0 Ahnung hat in 1-2 Sätzen. Das ist nämlich garnicht so einfach.
Übrigens, genau solche Leute wie du, die Lowlevel-C++ propagieren (das tus du nämlich!) sind für solche Threads http://www.c-plusplus.net/forum/viewtopic-var-t-is-163309.html verantwortlich: C++ eine unsichere Sprache, weiil es ja cool ist mit rohen Arrays, Pointer usw. rumzuhantieren. Anstatt von ANFANG an die sicheren C++ Features und Libraries dem C++ Einsteigern zu vermitteln. Wenn jemand in der ersten Lektion eines Buches rohe Arrays mit Pointern beigebracht bekommt (...)
Vorweg: ich habe den Thread nicht gelesen, nur mal (ganz) kurz reingeguckt. Wenn da quasi drinnen steht "C++ ist unsicher lalablabla, Java ist viel sicherer lalablabla" dann muss ich 100% zustimmen, denn es ist so. C++ bietet viel mehr Möglichkeiten Unsinn zu machen, Dinge falsch zu verstehen, ist viel umfangreicher, hat eine viel kompliziertere Standard-Lib etc. Wenn ich mir 2 Programmierer denke die beide z.B. 1 Jahr investiert haben um zu lernen (und natürlich beide gleiche Grundkenntnisse mitgebracht haben), der eine hat in dem einen Jahr C++ gelernt, der andere Java, und ich muss mir aussuchen wen ich ein Programm welches ich brauche schreiben lasse (in "seiner" jeweiligen Sprache), dann nehme ich ganz sicher den Java Programmierer. Ganz egal wie der C++ Programmierer C++ gelernt hat, ob jetzt nach "meiner" Methode, nach "deiner" Methode, oder ganz anders. Und das liegt einfach daran dass C++ eine sehr viel schwierigere Sprache ist als Java.
So. Nu meine eigentliche Antwort: C++ ist eine schwierige und potentiell unsichere low-level Sprache. Punkt. Wenn man irgendjmd. zuerst (oder fast ausschliesslich) diverse Klassen der Standard-Library beibringt ändert das daran nichst.
Weiters musst du damit rechnen dass Programmierer a) faul sind und b) hin und wieder auch Dinge erfahren die man ihnen nicht beigebracht hat. Ein Programmierer der sich mit Arrays und Zeigern auskennt, weiss warum die "gefährlich" sind und auf was er aufpassen muss, dafür aber std::string nicht kennt, wird weniger Blödsinn anstellen wenn er irgendwo über std::string stolpert, als ein Programmierer der std::string kennt, dafür aber keine Zeiger, und über sprintf stolpert. "Hui, da kann ich ja, das geht ja so schön, ...", *ZONK*, der nächste unchecked Buffer.
Unsichere/schlechte/... C++ Programme entstehen aus 2 Gründen:
Faulheit
Ungenügende Information/Unwissenheit/Unkenntnis
Punkt 1 kannst du nicht eliminieren, aber Punkt 2 sehrwohl. Jmd. etwas über std::string zu erzählen eliminiert Punkt 2 ganz sicher nicht, ihm etwas über Zeiger, Arrays und die "gotchas" von beiden zu erzählen schon eher.
Oder guck dir mal bloss die ganze STL an. Wo ist denn da bitte die ganze "Sicherheit" von der du redest? Der ganze Tanz mit den Iteratoren, den ganzen Algorithmen die z.B. Output-Iteratoren haben wollen. Wo ist denn da bitte der Unterschied zu den so bösen Zeigern? Wo ist da die "Sicherheit"? Und was ist einfacher ... jmd. zuerst zu erklären was ein Iterator ist/tut, und warum er auf gewisse Dinge aufpassen muss, und ihm dann erst zu erklären was ein Pointer ist? Oder es umgekehrt zu machen? Ich denke wenn jmd. mal weiss was ein Pointer ist reichen ein paar wenige Sätze um ihm beizubringen dass ein Iterator im Prinzip die Abstraktion eines Pointers ist.
---
Ich bin einfach der Meinung dass es besser ist bei einem Lernenden viele "aha, so kann man das also besser machen/vermeiden/vereinfachen..." Momente zu erzeugen, als viele "aha, so funktioniert das womit ich die ganze zeit schon gearbeitet habe also" Momente. Ersteres spricht die (fast) jedem innewohnende Faulheit an, was dazu führt dass man es sich gerne merkt. Zweiteres interessiert sicher die wenigen die einfach immer wissen wollen wie Dinge genau unter der Oberfläche funktionieren, andere werden es sich nicht merken weil sie eben faul sind und sich denken "das ist low-level lala, das muss ich nicht wissen". Faulheit ist des Programmierers Feind, und C++ ist keine Sprache die Faulheit oder Unkenntnis toleriert.
Das alles ist natürlich bloss meine Meinung, auch wenn ich es teilweise sehr dogmatisch formuliert habe.
Dass du evtl. anderer Meinung bist ist auch schön und OK für mich, aber bitte versuche du meinen Standpunkt zu verstehen (du musst ihn ja nicht teilen), und deinerseits nicht wieder mir etwas in den Mund zu legen was ich so nicht gesagt (geschrieben) habe.
p.S.: eine weitere Überlegung: guck dir diverse C++ Libraries an für Dinge die die STL nicht abdeckt. Dauernd stösst man auf raw pointer, auf callbacks, auf was weiss ich was alles was potentiell sehr unsicher ist. Ist das schlechtes Design? Ja, durchaus. Kann ein C++ Programmierer deswegen darauf "verzichten" sich damit herumschlagen zu müssen? Ich denke nein. Und sollte er dann, damit er damit umgehen kann, die "Basis" sehr gut kennen? Ich denke ja.
Sorry dass das jetzt etwas lange geworden ist.