welche vorteile bietet c++ gegenüber c



  • Hallo,

    bei meinem Versuch eine gute erklärung zu finden welche vorteile c++ gegenüber c bietet bin ich auf diese Seite gestoßen :

    http://www.math.uni-bayreuth.de/~rbaier/lectures/c++_intro/html/node16.html

    Also, entweder ich unterschätze die bedeutung dieser Punkte oder c++ bietet wenige neuerungen wenn man es so nennen darf. Und punkt 3 gibt es auch in C.
    Im Internet lese ich auch oft das c++ objektorientiert ist. Bei Wikipedia steht ein Beispiel

    Beispiel:
    Die Klasse „Auto“ legt fest, dass das Auto vier Reifen, fünf Türen, einen Motor und fünf Sitze hat.
    Das Objekt „Automodell1“ hat schließlich vier Reifen mit dem Durchmesser 60 cm und der Breite 20 cm, fünf rote Türen, einen Motor mit 150 kW und fünf Ledersitze.
    Ein weiteres Objekt „Automodell2“ hat vier Reifen mit dem Durchmesser 40 cm und der Breite 15 cm, fünf blaue Türen …
    Beide Objekte sind unterschiedlich, gehören aber zu der gemeinsamen Klasse Auto.

    Ich bin zwar erst 2 Monate dabei, aber das errinert mich stark an struct..

    Kann mich jemand aufkären ?



  • Incoming shit storm...



  • Ich _bin_ es.

    Der arme Dozent hat offensichtlich selbst C++ nicht verstanden, weswegen du auf keinen Fall mit dieser Vorlesung lernen solltest. Kauf die den "C++ Primer" oder "Der C++ Programmierer" und lern es richtig, dann wird dir auch ganz schnell klar, was die Vorteile sind (wenn du C schon kannst).



  • vergiss den Link :).

    Wesentliche Vorteile von C++:

    • Direkte Unterstützung von OOP: Klassen, Vererbung, etc.
    • Direkte Unterstützung für generische Programmierung: Templates
    • Template Metaprogrammierung
    • Namespaces
    • Umfangreichere Standardbibliothek zB viele fertige Datenstrukturen und Algorithmen
    • Operator Overloading
    • Default Parameter
    • Überladung


  • Also der Inhalt des Links zu den Vorteilen von C++ enthält keine Fehler. Aber es fehlen sicherlich noch ein paar nennenswerte Punkte. Aber für einen Einstieg reichen die Punkte.

    Und du unterschätzt die genannten Vorteile, denn in der Praxis wirken die Punkte sich sehr stark aus.

    Übrigens: Manchmal ist der Fortschritt nicht so stark spürbar, wie der Rückschritt!💡 :p

    Wenn du die C++-Vorteile in produktiven Projekten nutzt, und dann irgendwann darauf verzichten musst, um reines C zu nutzen, wird dir bewusst werden, was du an C++ hattest. 😉

    Übrigens ist C++ nicht ausschließlich Objektorientiert. Es ist ein Paradigma von vielen. C++ ist eine Multi-Paradigmen-Sprache und unterstützt sehr viele Konzepte der Software-Entwicklungstechnik. Viele Paradigmen, z.B. Metaprogrammierung, sind direkt in der Sprache enthalten, während andere Programmiersprachen dafür externe Tools benötigen.

    C++ ist sehr komplex, man kann es gar nicht in ein paar Absätzen erklären. Deshalb kann man selbst als erfahrener C++-Programmierer nicht alles von C++ können.



  • Ich würde vielleicht gar nicht so auf dem OOP-Begriff rumreiten und es nur so zusammenfassen:

    C++ erlaubt es Dir eigene Objekt-Typen, Objekt-Typ-Familien und Funktionsfamilien (Templates) zu erzeugen, die sehr leicht benutzbar sind (dank überschreibbarer Kopiersemantik, Destruktoren, Operatoren). Das spiegelt sich auch in der Standardbibliothek wider, welche viele nützliche Bausteine anbietet.

    Beispiel:

    #include <iostream>
    #include <map>
    #include <string>
    
    int main() {
      using namespace std;
      map<string,string> telefonbuch;
      telefonbuch["Alf"]="555-8531";
      telefonbuch["Ghostbusters"]="555-2368";
      string name;
      cin >> name;
      auto iterator = telefonbuch.find(name);
      if (iterator==telefonbuch.end()) {
        cout << "Eintrag nicht gefunden.\n";
      } else {
        cout << name << " hat die Telefonnummer " << iterator->second << '\n';
      }
    }
    

    (ungetestet)

    Eine Datenstruktur wie std::map<> gibt es nicht im C-Standard. Und selbst wenn man sich eine halbwegs "generische" Implementierung einer solchen Datenstruktor in Form einer C-Bibliothek sucht, wird das Hauptprogramm weniger leserlich und wahrscheinlich weniger typsicher sein. Ich lass mich aber auch gern vom Gegenteil überzeugen. 🙂


  • Mod

    Ich dachte immer, printf und scanf gehören gar nicht zum Sprachumfang von C - haben jedenfalls die Entwickler der Sprache so ausgedrückt.



  • krümelkacker schrieb:

    Eine Datenstruktur wie std::map<> gibt es nicht im C-Standard. Und selbst wenn man sich eine halbwegs "generische" Implementierung einer solchen Datenstruktor in Form einer C-Bibliothek sucht, wird das Hauptprogramm weniger leserlich und wahrscheinlich weniger typsicher sein. Ich lass mich aber auch gern vom Gegenteil überzeugen. 🙂

    Du kannst ueber den preprozessor - klappt ganz ok. der code sieht dann auch auf der client seite nett aus (die implementierung ist halt haesslich wie die nacht).

    Aber natuerlich sind generische Datenstrukturen in Sprachen ohne Templates/Generics/Ducktyping eine ziemliche Katastrophe.



  • nachtfeuer schrieb:

    Ich dachte immer, printf und scanf gehören gar nicht zum Sprachumfang von C - haben jedenfalls die Entwickler der Sprache so ausgedrückt.

    Gehoert die Library zur Sprache? Die Library ist gemeinsam mit der Syntax und Semantik der Sprache in einem Standard zusammengefasst. Ist die Library deshalb unbedingt teil der Sprache? Das ist wohl dann Definitionssache.



  • rüdiger schrieb:

    Umfangreichere Standardbibliothek zB viele fertige Datenstrukturen und Algorithmen

    Gut, dass du umfangreichere und nicht umfangreiche geschrieben hast.



  • Shade Of Mine schrieb:

    krümelkacker schrieb:

    Eine Datenstruktur wie std::map<> gibt es nicht im C-Standard. Und selbst wenn man sich eine halbwegs "generische" Implementierung einer solchen Datenstruktor in Form einer C-Bibliothek sucht, wird das Hauptprogramm weniger leserlich und wahrscheinlich weniger typsicher sein. Ich lass mich aber auch gern vom Gegenteil überzeugen. 🙂

    Du kannst ueber den preprozessor - klappt ganz ok. der code sieht dann auch auf der client seite nett aus (die implementierung ist halt haesslich wie die nacht).

    Und? Wie sieht's mit Typsicherheit aus?

    Shade Of Mine schrieb:

    Aber natuerlich sind generische Datenstrukturen in Sprachen ohne Templates/Generics/Ducktyping eine ziemliche Katastrophe.

    Es gibt noch einen eingefleischten C-Programmierer und Compiler-Entwicklier, der für C auch eine "generische Container Bibliothek" bastelt. Codegenerierung per Textersetzung findet da meines Wissens nach mit einem extra Tool statt. Das kommt IMHO noch lange nicht an C++ Templates ran. Die Elemente werden da auch nur per memcpy kopiert; es gibt ja keine Kopierkonstruktoren, Destruktoren und dergleichen in C. Wenn sich das jemand mal angucken will, einfach mal nach Jacob Navia googeln. Ich als möglicherweise befangener C++ Programmierer sehe das aber eher als Zeitverschwendung.

    Man muss aber auch sagen, dass man im Linux-Kernel C-Quellcode interessante Muster findet. Da gibt es einige, die man in C++ nicht findet, weil's mit C++ Bordmitteln anders auch geht. Die C-Version sieht dabei aber gar nicht so schlecht aus -- mal von einem ekligen Pointer-Hack, der in einem Makro versteckt ist, und der Typunsicherheit abgesehen. Ich habe hier konkret eine Listendatenstruktur im Kopf, bin aber zu Faul, Zitate rauszusuchen. Wen es interessiert, kann da selbst mal reingucken... 🙂



  • Danke für eure Hilfe, ich glaube ich kenne jetzt die Relativen Unterschiede. Das mit den Programmiersprachen ist auch Kompliziert. Als Beispiel :

    Mein Vater sagt : Assembler ist am bestem damit kannst du alles machen
    Mein Onkel sagt : Nimm C, damit bist du fürs erste gut bedient
    Ein Freund sagt : C++ bietet die Meisten Vorteile
    Meine Tante sagt : Delphi ist defenitiv das beste
    Mein Lehrer sagt : C und c++ ist schwachsinn nimm c#

    Naja, letztlich hab ich mich für C entschieden da :

    Assembler zu Kompliziert ist
    C++ wusste ich nicht was der unterschied zu C ist
    Delphi, keine Ahnung war son Bauchgefühl
    c# nicht weil das vertrauen zum Lehrer mit der Frage was
    was Ubuntu sei Abgrochen ist. Also hab ich mich für C entschieden.
    Programmiere erst 2 Monate, kann dafür aber schon einiges.

    Angenommen ich möchte Simmulationen schreiben (nicht jetzt, in
    paar jahren) was würdet ihr mir dann empfehlen ?

    EDIT : Ich glaube c++, das mit den Zusammenhängenden Objekten,
    aber das bietet so weit ich weiß auch Delphi und C#.
    Letzteres läuft aber glaub ich nur unter Windows.



  • NoName57253 schrieb:

    Mein Vater sagt : Assembler ist am bestem damit kannst du alles machen

    Mit 99% C und 1% Assembler kannst Du auch alles machen.
    Mit 99% C++ und 1% Assembler kannst Du auch alles machen.
    Das ist also kein Argument.

    NoName57253 schrieb:

    Mein Onkel sagt : Nimm C, damit bist du fürs erste gut bedient

    Die Frage ist "wofür?".

    NoName57253 schrieb:

    Ein Freund sagt : C++ bietet die Meisten Vorteile

    C++ bietet ein sehr breites Abstraktionsspektrum. Du kannst dich auf Bit-und-Byte Ebene austoben genauso wie auf einer hohen Abstraktionsebene (höher als bei C, und das ist gut so).

    NoName57253 schrieb:

    Meine Tante sagt : Delphi ist defenitiv das beste

    für was?

    NoName57253 schrieb:

    Mein Lehrer sagt : C und c++ ist schwachsinn nimm c#

    Das kann man natürlich nicht so einfach sagen. Kommt immer drauf an, was Du machen willst. Von mir aus kannst Du auch Python programmieren. Ist ja auch sehr populär zZ.

    NoName57253 schrieb:

    Naja, letztlich hab ich mich für C entschieden da :

    Das ist schade. Ich will Dir nicht vorschreiben, was Du zu lernen hast. Aber wenn Du die Wahl zwischen C und C++ hast, dann würde ich Dir zu C++ raten.

    NoName57253 schrieb:

    C++ wusste ich nicht was der unterschied zu C ist.

    Das sind Welten.

    NoName57253 schrieb:

    Angenommen ich möchte Simmulationen schreiben (nicht jetzt, in
    paar jahren) was würdet ihr mir dann empfehlen ?

    Geschichte (Angaben ohne Gewähr): Der C++ Erfinder wollte auch für seine Doktorarbeit eine Art von Netzwerk simulieren. Die erste Version hatte er in Simula geschrieben. Schön objektorientiert mit Garbage-Collection & co. Lief aber super langsam alles. Er hat es dann in C neu geschrieben, vermisste dabei aber die OO-Features. Später hatte er dann einen Compiler selbst geschrieben der ein C-Derivat ("C with classes") nach C-Quellcode kompiliert. Daraus entstand schließlich C++. Mit C++ hast Du mehr Abstraktionsmöglichkeiten zur Verfügung, ohne dass dabei irgendein unnötiger Overhead dabei ist. Abstraktion ist gut. Hilft beim Problem lösen. Hilft beim Modellieren.

    Wenn Du Programme schreibst, bei denen Geschwindigkeit und Speicherverbrauch nebensächlich ist, kannst Du auch andere Sprachen verwenden. Die bieten natürlich auch Vorteile ... Typischerweise hat man in einer "dynamischen" Sprache (ich denke da an Python) Programme schneller geschrieben. Die Entwicklungszeit ist natürlich auch so ein Faktor. Als Anfänger ist das jedenfalls weniger frustrierend und man kommt schneller zu Erfolgen.



  • Ah, danke für die Hilfe. 🙂
    Nettes Beispiel



  • 1. Bjarne sollte eine Simualtion entwickeln und da in einer Simulation Objekte zusammen spielen, und Simula (wer hätte das gedacht) objektorientiert für Simulationen entwickelt wurde, tat er das in Simula. Simula hatte schon in den 60er Jahren Garbage Collection, was heute von Java, C# u.a. als modern gefeiert wird. 🙄 Aber durch den GC war die Simulation von Bjarne zu langsam.

    2. Also schaute er sich nach was schnellerem um. Dabei ist er auf BCPL gestoßen. Eine typlose Sprache, die sehr schnell ist. Er setzte es damit um, mußte aber feststellen, das BCPL zwar performant ist, aber ätzend schlecht für große Projekte war, weil es keine Typen gab.

    3. In der Zeit, entwickelten aber die Unix-Gurus C. Bjarne stellte fest, das C mit UNIX bewies, das C sowohl für große Projekte geeignet ist, und performant ist!

    4. Aber von Simula fand er die Objektorientierung für seine Simulation genial, die in C aber fehlte. 😡 Also war die Lösung: C mit Simula-Fähigkeiten. Was dann C with Classes heraus brachte und später in C++ umbenannt wurde.

    Ich persönlich finde hier folgendes interessant: bis C++ entstand, hat der Erfinder Bjarne Stroustrup viele Sprachtypen für ein reales Projekt durchprobiert. Er hat förmlich eine Odyssee durch gemacht und damit unfreiwillig Erfahrung gesammelt, was eine Sprache zu sein hat oder auch nicht zu sein hat. Und aus dieser Odyssee hat er eine Lösung erarbeitet. Es gab also wirklich ein "Problem" zu lösen! Die Sprache C++ ist nicht aus Marketinggründen entstanden.

    C++ ist eine der meist gehassten Sprachen. Aber komischerweise trotzdem meist eingesetzten Sprache. 😃 Und viele Menschen prophezeien jedes Jahr ihren Tod.

    Besonders da C++ eine Multiparadigmen-Sprache ist, und so viele Einsatzfelder abdeckt, fühlen sich alle anderen Sprachen bedroht. Selbst C Programmierer fühlen sich von C++ bedroht, weil C++ immer mehr in dessen Territorien wildert, da C++ verstärkt in Embedded-Systemen eingesetzt wird. Wer z.B. in den ipod-Nano das Lizenz-Menü aufruft, wird darin die C++ Boost-Library-Lizenz finden.

    C++ wird nicht nur in Simulationen und ipods genutzt, sondern auch in Maschinen die man normalerweise simuliert. 😉 Wie z.B. im JOINT STRIKE FIGHTER F-35 Jet. Man kann die Programmier-Richtlinien für JOINT STRIKE FIGHTER unter folgender URL bei Bjarne herunter laden:
    http://www.research.att.com/~bs/JSF-AV-rules.pdf

    Wo wird C++ beim JSF eingesetzt?

    Die Avionik-Software wird bei Entwicklungsende voraussichtlich rund 4,5 Millionen Zeilen C++-Code umfassen

    Quelle: http://de.wikipedia.org/wiki/Lockheed_Martin_F-35

    Die Avionik – ... – ist ein Begriff aus der Luft- und Raumfahrttechnik und bezeichnet die Gesamtheit der elektrischen und elektronischen Geräte an Bord eines Fluggerätes, einschließlich der Fluginstrumente.

    Quelle: http://de.wikipedia.org/wiki/Avionik



  • Artchi schrieb:

    Ich persönlich finde hier folgendes interessant: bis C++ entstand, hat der Erfinder Bjarne Stroustrup viele Sprachtypen für ein reales Projekt durchprobiert. Er hat förmlich eine Odyssee durch gemacht und damit unfreiwillig Erfahrung gesammelt, was eine Sprache zu sein hat oder auch nicht zu sein hat.

    Finde ich nicht außergewöhnlich. Das ist vermutlich bei sehr vielen Sprachen so, dass man sich bestehende anschaut und sagt: "Okay, das ist nicht gut und das ist gut für das, was wir mit der neuen Sprache FooBar machen wollen." Dann kommen natürlich noch "neue" Features hinzu, die sich so eher selten oder gar nicht in anderen Sprachen fanden.

    Und aus dieser Odyssee hat er eine Lösung erarbeitet. Es gab also wirklich ein "Problem" zu lösen! Die Sprache C++ ist nicht aus Marketinggründen entstanden.

    Die Rückwärtskompatibilität zu C ist ein Marketinggrund, oder nicht? Er wollte möglichst viele C Programmierer für die Sprache begeistern. Oder spricht sonst was dafür, unbedingt C-Syntax einzusetzen (die in C++ dann so herrlich kontextsensitiv wird)? Schließlich haben alle relevanten Sprachen ein Möglichkeit, C-Code aufzurufen.

    C++ ist eine der meist gehassten Sprachen. Aber komischerweise trotzdem meist eingesetzten Sprache. 😃 Und viele Menschen prophezeien jedes Jahr ihren Tod.

    Eine Sprache mit mindestens mittelmäßiger Bedeutung stirbt nicht einfach aus. Es gibt viel Legacy-Code, den es zu pflegen gilt. Die wichtigeren Fragen sind imo: Wie viele neue Projekte werden in C++ gestartet? Und in welchen Einsatzfeldern? Wie wird C++ an den Universitäten unterstützt? Gibt es eine steigende oder fallende Anzahl an Leuten, die C++ beherrschen? Diese Fragen kann man natürlich auch für C stellen etc. Ich will nicht darauf hinaus, dass X besser als Y ist.

    C++ wird nicht nur in Simulationen und ipods genutzt, sondern auch in Maschinen die man normalerweise simuliert. 😉 Wie z.B. im JOINT STRIKE FIGHTER F-35 Jet. Man kann die Programmier-Richtlinien für JOINT STRIKE FIGHTER unter folgender URL bei Bjarne herunter laden:
    http://www.research.att.com/~bs/JSF-AV-rules.pdf

    Wo wird C++ beim JSF eingesetzt?

    Die Avionik-Software wird bei Entwicklungsende voraussichtlich rund 4,5 Millionen Zeilen C++-Code umfassen

    Quelle: http://de.wikipedia.org/wiki/Lockheed_Martin_F-35

    Die Avionik – ... – ist ein Begriff aus der Luft- und Raumfahrttechnik und bezeichnet die Gesamtheit der elektrischen und elektronischen Geräte an Bord eines Fluggerätes, einschließlich der Fluginstrumente.

    Quelle: http://de.wikipedia.org/wiki/Avionik

    JSF? pfff, kinderkacke :p This is the real shit: http://www.flownet.com/gat/jpl-lisp.html (Das ist eher allgemein gehalten, hier wird's dann konkret: http://ic.arc.nasa.gov/publications/pdf/2000-0176.pdf Aber beides ist lesenswert)



  • Artchi schrieb:

    Simula hatte schon in den 60er Jahren Garbage Collection, was heute von Java, C# u.a. als modern gefeiert wird. 🙄

    ... und LISP schon 1959

    wieso hat man eigentlich nicht einfach mit Simula weitergearbeitet und den GC weggelassen, wenn er nicht performant genug für die damalige Hardware war?

    Algol ist doch eine hübsche Sprache, die im Vergleich mit der rund 40 Jahre jüngeren Go noch gut abschneidet.



  • Ganz einfach gesagt: C war der ürsprüngliche Standard und C++ hat diesen sinnvoll erweitert. Beides ist erhalten geblieben und kann parallel genutzt werden. Was du daraus machst, bleibt allein deine Angelegenheit.



  • NoName57253 schrieb:

    Ich bin zwar erst 2 Monate dabei, aber das errinert mich stark an struct..

    Kann mich jemand aufkären ?

    Das dich dies an struct erinnert ist richtig, denn auch das ist in C mit struct möglich.

    Aber Klassen bieten noch weitere Features im Gegesatz zu structs.

    Das wichtigste dürften wohl Methoden sein.
    Eine Methode ist im Prinzip nichts anderes als eine Funktion, die an eine Klasse gebunden ist.

    Du könntest also entsprechend dem Beispiel eine Methode schreiben wie z.b:

    auto_fahre_los();

    oder

    auto_halte_an();

    Mit Structs ist so etwas nicht möglich, da bei Structs die Structs von den Funktionen getrennt sind.
    In C sind Funktionen also nicht an die Structs gebunden.
    In C++ kann man aber Funktionen an Klassen binden.

    Desweiteren bieten Structs keine Vererbung.

    Du kannst also nicht ein Struct auf ein anderes Struct aufbauen lassen, in dem es dessen Elemente ert.
    In deinem Autobeispiel hast du z.b. zwar Datenelemente wie Reifen, Motor & Co,
    aber eben noch kein Schiebedach oder Cabrioversion usw.

    Bei einer Klasse könntest du also eine neue Klasse Namens "Cabrio" definieren und alle Eigenschaften der Klasse "Auto" erben.

    Damit hat also auch das Carbio Daten für Reifen, Motor usw.



  • krümelkacker schrieb:

    NoName57253 schrieb:

    Mein Vater sagt : Assembler ist am bestem damit kannst du alles machen

    Mit 99% C und 1% Assembler kannst Du auch alles machen.
    Mit 99% C++ und 1% Assembler kannst Du auch alles machen.
    Das ist also kein Argument.

    Das stimmt leider nicht ganz.

    Wenn man z.b. spezielle Mikrocontroller programmieren will, dann braucht man dafür auch einen entsprechenden Compiler und einen C++ Compiler gibt es halt nicht immer für einen Mikrocontroller.

    Einen C Compiler für einen Mikrocontroller kriegt man aber immer.
    Das ist der große Vorteil von C, was unter anderem auch daran liegt, daß C sehr schlank ist und es daher kein so riesiger Aufwand ist, für eine gegebnene CPU oder Mikrocontroller einen C Compiler zu schreiben.

    Assembler ist dagegen kritisch, da Assembler überwiegend an die CPU gebunden ist.
    Man kann zwar einige wenige Funktionen (z.b. mov) auf andere CPU Plattformen übertragen, aber es ist halt doch alles irgendwie etwas anders.

    Noch etwas zum Unterschied zwischen C und C++.

    C++ hat noch ein wichtiges Feature, daß C nicht kann.
    Die Funktionsüberladung.

    Wenn man in C z.b. den Betrag eines Zahlenwertes herausbekommen will,
    dann muß man darauf achten welche Funktion man verwendet, denn für jeden Datentyp (int, double, float) gibt es einen anderen Funktionsnamen:
    z.B.
    für int Werte heißt diese abs()
    für double heißt sie fabs()
    und für float fabsf(x)

    Bei C++ ist das nicht notwendig.
    Dank Funktionsüberladung kann man eine Funktion schreiben die mit allen Datentypen die man als Parameter gibt klarkommt

    mein_abs() kann also int, double und float Werte bearbeiten.

    Das spart mächtig Arbeit und sorgt für weniger Verwirrung.

    NoName57253 schrieb:

    Naja, letztlich hab ich mich für C entschieden da :

    Das ist schade. Ich will Dir nicht vorschreiben, was Du zu lernen hast. Aber wenn Du die Wahl zwischen C und C++ hast, dann würde ich Dir zu C++ raten.

    Ich sehe das anders.
    Er ist Neuling und deswegen ist C besser geeignet, da der Sprachumfang kleiner ist.

    Wenn er dann C beherrscht, dann kann er auf C++ umsteigen und weiterlernen.


Log in to reply