casten explizit?



  • Kann man irgendwie festlegen, dass Datentypen nicht mehr implizit konvertiert werden, sondern jedesmal explizit die Konvertierung durchgenommen werden muss?



  • Bei eingebauten Datentypen nicht, bei selbstdefinierten schreibt man vor Konstruktoren, die mit einem Argument aufgerufen werden können das Schlüsselwort explicit.

    class A {
    
    public:
       A();
       explicit A(int i);
       explicit A(const std::string &str, int i = 0);
    };
    

    Stefan.



  • Schade



  • Optimizer schrieb:

    Schade

    ist doch logisch, dass es nicht geht.
    dann koenntest du ja fast die ganze C++ Standard Library nicht mehr verwenden...

    was willst du damit denn bezwecken?



  • ganz einfach, dass ich bei jeder int-double oder double-int Konverterung auch hinschreiben muss

    dVariable = (double)iVariable;
    

    Erstens finde ich es ordentlich, wenn man jede Konvertierung anzeigt und zweites entdecke ich so vielleicht überflüssige casts.



  • du willst absichtlich mehr casts machen, um ueberfluessige casts zu entdecken?
    und wenn wuerde ich das dann nicht c-style sondern static_cast oder so casten, damit man auch danach suchen kann.



  • Ich will doch nicht mehr casts machen. Wenn ich nen int durch nen double teile, wird automatisch gecastet. Es macht keinen Unterschied, ob ich den cast noch hinschreibe.



  • doch, den unterschied macht es:

    10 / 3.3
    oder
    static_cast<double>(10) / 3.3
    das ist der unterschied wohl klar.

    casten sollst du nur, wenn du es musst - also quasi nie.

    alles was implizit umgewandelt ist sicher - sprich es kann nix kaputt gehen.
    wenn was kaputt gehen kann, warnt der compiler.

    wenn du jetzt aber immer castest, kann er nicht warnen:

    double d=3.3;
    int i=static_cast<int>(d);
    hier warnt der compiler nicht.
    int i=d;
    hier schon.

    also:
    casts nur dann wenn nötig - sonst böse.



  • Toll, ich brauch aber irgendeine Möglichkeit, mir alle impliziten casts mal anzuschauen, damit ich mir die entsprechenden Abschnitte nochmal durch den Kopf gehen lassen kann.
    Ich hab z.B. erst vor kurzem gecheckt, dass wenn ich

    abs(floatVariable)

    schreib, dass daraus ein int gemacht wird. Der Compiler hat mich nämlich erst gewarnt, als ich ein double übergeben hab. Aufgrund dieser Erkenntnis hab ich mir ne eigene abs-Funktion geschrieben, für double-Werte. Dass ich darauf gekommen bin, war reiner Zufall.



  • dann lies doch mal ne doku!

    abs ist für int
    und fabs für double

    welchen compiler verwendest du, dass er dich da nicht warnt??



  • VC++ .NET

    bei double hat er schon gewarnt bei float nicht. Mir geht es aber sowieso nicht darum, dass beim casten was verloren geht, mir geht es darum, dass ich vielleicht irgendwo unnötig hin und her caste und das auf die Performance geht.



  • Shade Of Mine schrieb:

    dann lies doch mal ne doku!

    abs ist für int
    und fabs für double

    Interessante "Doku".



  • Daniel E. schrieb:

    Interessante "Doku".

    definitiv geht es hier um C, denn sonst würde der compiler bei double wohl kaum warnen, oder?



  • Shade Of Mine schrieb:

    definitiv geht es hier um C, denn sonst würde der compiler bei double wohl kaum warnen, oder?

    Oder. Wie erkläst Du dir, dass der Compiler scheinbar willkürlich bei doubles warnt und bei floats nicht (mal abgesehen davon, dass das das gute Recht des Compilers ist)?



  • Shade Of Mine schrieb:

    casten sollst du nur, wenn du es musst - also quasi nie.

    Cool, ob die Programmierer der MFC das auch wussten? 😃



  • Daniel E. schrieb:

    Shade Of Mine schrieb:

    definitiv geht es hier um C, denn sonst würde der compiler bei double wohl kaum warnen, oder?

    Oder. Wie erkläst Du dir, dass der Compiler scheinbar willkürlich bei doubles warnt und bei floats nicht (mal abgesehen davon, dass das das gute Recht des Compilers ist)?

    ich hab keinen compiler zur hand, aber ich glaube mich zu erinnern, dass abs() in C++ für
    int, float und long double überladen ist.

    folglich dürfte abs(3.3); keine warnung produzieren (es sei denn der compiler warnt vor double in long double)

    wenn ich jetzt blödsinn geschrieben habe, bite korrigieren.



  • Shade Of Mine schrieb:

    ich hab keinen compiler zur hand, aber ich glaube mich zu erinnern, dass abs() in C++ für
    int, float und long double überladen ist.

    Und long, complex und so (valarray?).

    Meine Frage war, wieso ein Compiler vor f(3.3) warnt, nicht aber nicht vor f(3.3f), mit 'void f(int)' (für den Spezialfall f == abs) und wie man daraus schließen kann, es ginge um C.



  • Nein, es gibt 3 Version für abs, aber ein
    double abs(double)
    gibt es bei mir nicht. Die Funktion hab ich selber schreiben müssen, nachdem ich das zufälligerweise entdeckt habe.



  • Optimizer schrieb:

    Nein, es gibt 3 Version für abs, aber ein
    double abs(double)
    gibt es bei mir nicht. Die Funktion hab ich selber schreiben müssen, nachdem ich das zufälligerweise entdeckt habe.

    kann es sein, dass du math.h statt cmath inkludierst??



  • Jo. Was ist an cmath besser?


Anmelden zum Antworten