Unterschiede zu C++ für Umsteiger von Java



  • schorsch code schrieb:

    Es ist schon praktisch, wenn man den Kunden nicht dazu zwingen muss, 100MB an libs zu installieren, obwohl es möglich ist, mit nur 1MB und ohne Installation auszukommen.

    Artchi schrieb:

    😕 Was will uns der Schreiber hier mitteilen? 😕

    Simon2 schrieb:

    Stimmt ! Besser 1,6 GB an Runtime tief im System vergraben (inkl. Registry&Co) !!
    🙄

    Was ich eigentlich sagen wollte, ist dass ich bei C++ eben keine riesige Runtime vorraussetzen muss, sondern nicht mehr als nur die benötigten Libs dazu packen brauche.



  • net schrieb:

    @simon:
    du hast jedenfalls gute und überzeugende pro-C++ argumente. das muss man dir lassen. solche threads wie diesen gibt's ja öfter hier, aber so gut wie du bekommt das kaum keiner hin (meiner meinung nach).

    :xmas1: hoch, jetzt werd' ich aber ein wenig rot ... 😋

    Danke.

    Da wir hier in der Firma sowohl das eine wie das andere programmieren und einige seeeehr fähige Leute haben, bekommt man halt so einiges mit.

    Und (wie wahrscheinlich schon oft gesagt) ich bemühe mich, um ein möglichst objektives Bild der beiden Sprachen (was nicht einfach ist, wenn das eigene Herz bei C++ höher schlägt) ....
    Mich erinnern diese Auseinandersetzungen oft an "Bruderkriege", die umso heftiger und blutiger ausfallen, je ähnlicher sich die Brüder sind.
    (Wer schonmal Cobol oder C auf uralt Entwicklungsumgebung programmieren musste, weiß vermutlich, wovon ich rede). 🙂

    Gruß,

    Simon2.



  • schorsch code schrieb:

    schorsch code schrieb:

    Es ist schon praktisch, wenn man den Kunden nicht dazu zwingen muss, 100MB an libs zu installieren, obwohl es möglich ist, mit nur 1MB und ohne Installation auszukommen.

    Artchi schrieb:

    😕 Was will uns der Schreiber hier mitteilen? 😕

    Simon2 schrieb:

    Stimmt ! Besser 1,6 GB an Runtime tief im System vergraben (inkl. Registry&Co) !!
    🙄

    Was ich eigentlich sagen wollte, ist dass ich bei C++ eben keine riesige Runtime vorraussetzen muss, sondern nicht mehr als nur die benötigten Libs dazu packen brauche.

    Aha !!!
    Dann bitte ich vielmals um Entschuldigung - ich hatte das genau andersherum (miß-)verstanden.

    Gruß,

    Simon2.



  • net schrieb:

    ich hab noch'n paar nachteile von C++: :xmas2:

    * einfache datentypen sind in C++ variabel (länge, byte order usw.).

    Hat aber auch seine Vorteile: wenn ich auf einem 256 bit System entwickel, unterstützt mein Compiler höchstwahrscheinlich mit einem long die volle 256 bit Breite. Bei Java bin ich auf die eine SUN-Specifikation festgenagelt. Weiterhin kann ich in C++ durch ein einfaches typedef ebend mal für ein anderes System den Typ anpassen, ohne ein Refactoring durchführen zu müssen. Der eine "Mangel" wird notgedrungen ein positiver Nebeneffekt.

    net schrieb:

    * in C++ handelt man sich schnell 'undefiniertes verhalten' ein. das gibt's in java gar nicht (jedenfalls nicht das ich wüsste).

    Ja, ist manchmal nervig. Habe aber schon öffters in diversen JRE-Versionen nicht das Verhalten gehabt, welches mir laut SUN-Spec versprochen wurde. ➡ Bug!

    net schrieb:

    * in C++ gibts keinen '>>>' operator. (okay, lässt sich leicht nachbilden, aber manchmal fehlt der eben).

    Hier habe ich eine Wissenslücke: Was ist der '>>>" Operator? (ernste Frage!)



  • Artchi schrieb:

    Hier habe ich eine Wissenslücke: Was ist der '>>>" Operator? (ernste Frage!)

    right-shift unter missachtung des vorzeichens (schiebt auch bei negativen zahlen nullen rein).



  • Artchi schrieb:

    net schrieb:

    ich hab noch'n paar nachteile von C++: :xmas2:
    * einfache datentypen sind in C++ variabel (länge, byte order usw.).

    Hat aber auch seine Vorteile: wenn ich auf einem 256 bit System entwickel, unterstützt mein Compiler höchstwahrscheinlich mit einem long die volle 256 bit Breite.

    das kann man nicht unbedingt als vorteil sehen, wenn ein programm plötzlich 80% mehr speicher braucht der einfach nur brach liegt 😃



  • @Artchi&simon2
    Hallo nochmal ich, habe mich jetz ausgiebig mit dem verzicht auf zeiger beschäftigt,
    und noch ne frage, wollte nich gleich nochmal nen thread aufmachen:

    Kann es sein, daß ein Fall, bei dem man nicht darauf verzichten kann(auf zeiger), ist, wenn man rein abstrakte klassen verwendet?
    Oder gibts da auch noch tricks?
    Ansonsten nochmal danke für die hinweise, man kommt echt fast vollkommen ohne aus, so ist das viel schöner.
    Dummerweise hatte ich halt anfangs meine eigenen container geschrieben und da gabs mit referenzen bissel probs(is mir noch nich ganz klar was genau), aber mit den stl containern läuft das super.
    cu



  • QarateKid schrieb:

    Kann es sein, daß ein Fall, bei dem man nicht darauf verzichten kann(auf zeiger), ist, wenn man rein abstrakte klassen verwendet?
    Oder gibts da auch noch tricks?

    Ja, für abstrakte Klassen benötigst du Zeiger (weil sie abstrakt sind, können sie schließlich nicht direkt erzeugt werden). Möglicherweise kann man da auch über Referenzen vorgehen, aber ob das praktikabel ist, ist die andere Frage.

    (und generell im Zusammenhang mit Polymorphie sind Zeiger recht hilfreich)



  • QarateKid schrieb:

    @Artchi&simon2
    ...Kann es sein, daß ein Fall, bei dem man nicht darauf verzichten kann(auf zeiger), ist, wenn man rein abstrakte klassen verwendet?...

    Wieso ?
    Es gibt doch Referenzen:

    class A {
       public:
          virtual void f() const  = 0;
          virtual ~A() {}
    };
    
    class B : public A {
       int i;
       public:
          B(int li) : i(li) {}
          void f() const { cout << "B::f: " << i << "\n"; }
    };
    
    class C : public A {
       string s;
       public:
          C(string ls) : s(ls) {}
          void f() const { cout << "C::f: " << s << "\n"; }
    };
    
    void f(A const & a) {
       cout << "f():";
       a.f();
    }
    
    int main() {
       B b(1);
       C c("Simon2");
    
       A& refB = b;
       A& refC = c;
    
       refB.f();
       refC.f();
    
       f(refB);
       f(refC);
       return 0;
    }
    

    Aber natürlich kannst Du NICHT

    A a = B(i); // Fehler: A ist nicht instantiierbar
    

    o.ä. machen.
    Beim CallByValue und ReturnByValue wird's natürlich "kribbelig" ... da musst Du evtl. doch manchmal auf Heap-Objekte ausweichen - aber Vieles kann man mit Referenzen (auf Stackobjekte) machen.

    Gruß,

    Simon2.



  • Also Zeiger brauchst du dann, wenn du sowas machen willst (wenn ich mal Simon2s Klassen benutze):

    A *a = new B();
    

    Weil das geht ja nicht:

    A a;  // A kann man nicht erzeugen
    

    Ansonsten nochmal danke für die hinweise, man kommt echt fast vollkommen ohne aus, so ist das viel schöner.
    Dummerweise hatte ich halt anfangs meine eigenen container geschrieben und da gabs mit referenzen bissel probs(is mir noch nich ganz klar was genau), aber mit den stl containern läuft das super.
    cu

    Aber du machst doch nicht sowas:

    std::vector<A&> a_vec;
    

    Referenzen im Container ist ganz schlecht.



  • Artchi schrieb:

    Also Zeiger brauchst du dann, wenn du sowas machen willst (wenn ich mal Simon2s Klassen benutze):

    A *a = new B();
    

    Weil das geht ja nicht:

    A a;  // A kann man nicht erzeugen
    

    so gibt's 'nen pointer nur temporär 😉

    A& a = *(new B(1));
       ...
       a.f(); // c++ ist lustig: zugriff ohne pointer
    


  • Artchi schrieb:

    Also Zeiger brauchst du dann, wenn du sowas machen willst (wenn ich mal Simon2s Klassen benutze):

    A *a = new B();
    

    Weil das geht ja nicht:

    A a;  // A kann man nicht erzeugen
    

    Achja .... und für (die meisten ?) STL-Container auch, weil die ihre Inhalte "rumkopieren" und das geht mit Referenzen nicht, mit Zeigern aber schon.

    Gruß,

    Simon2.



  • net schrieb:

    ...
    // c++ ist lustig: zugriff ohne pointer
    ...

    ...dafür mit Speicherleaks :p

    Gruß,

    Simon2.



  • Simon2 schrieb:

    net schrieb:

    ...
    // c++ ist lustig: zugriff ohne pointer
    ...

    ...dafür mit Speicherleaks :p

    muss nicht. kannt ja 'delete &a' machen...
    edit: hab's gerade ausprobiert.
    ...aber wenn c++ schlau gemacht wär, würde es automatisch nach verlassen des scopes den destruktor aufrufen. macht es aber nicht 😞



  • net schrieb:

    ...aber wenn c++ schlau gemacht wär, würde es automatisch nach verlassen des scopes den destruktor aufrufen. macht es aber nicht 😞

    Dann müsste C++ so schlau sein zu ermitteln, ob die Referenz auf ein Heap-Objekt oder auf ein Stack-Objekt zeigt und wenn ersteres, ob noch andere Referenzen drauf zeigen. Dann jedoch sind wir eh wieder bei Java :p

    Also ich würde mich beschweren wenn C++ meine Objekte eigenmächtig killt, nur weil irgendwo eine Referenz ihr Leben aushaucht...



  • Naja, spätestens mit const-Refs dürfte damit aber Schluß sein .

    net schrieb:

    ..aber wenn c++ schlau gemacht wär, würde es automatisch nach verlassen des scopes den destruktor aufrufen. macht es aber nicht 😞

    Entweder Garbage-Collection oder nicht. So eine Mischform geht eben nicht...

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Entweder Garbage-Collection oder nicht. So eine Mischform geht eben nicht...

    warum nicht? könnte man doch in C++ einbauen - einen garbage collector nur für 'heap-referenzen' wie: Class &Object=*(new Class()); das wär doch nicht schlecht, der user hätte freie wahl ob er die eingebaute müllverbrennungsanlage benutzen will, oder C++ wie er's bisher kennt... :xmas2:



  • Dann nimm C++/CLI. Oder warte auf C++0x, da wird noch diskutiert, ob es nicht einen optionalen GC geben soll.



  • Artchi schrieb:

    ...warte auf C++0x, da wird noch diskutiert, ob es nicht einen optionalen GC geben soll.

    ach, das ist schon im gespräch?
    und ich dachte ich muss jetzt 'ne mail an diese standardisierungs-heinis schreiben 😉



  • net schrieb:

    warum nicht? könnte man doch in C++ einbauen - einen garbage collector nur für 'heap-referenzen' wie: Class &Object=*(new Class());

    Randfrage: Woher weiß das System, ob ich gerade eine Heap-Referenz oder eine Stack-Referenz habe? (wenn ich das direkt aufrufe, kann man das ja noch unterscheiden - aber bei einer Anweisung ala Class& ob = func(); siehst du schon nicht mehr, woher die Referenz kommt)


Anmelden zum Antworten