explicit???



  • Hab mal in der Suchfunktion geschaut, aber ich habe keine Erklärung gesehen.

    => Frage: Was ist das?



  • Damit stellst du klar, daß dieser Konstruktor nicht für implizite (automatische) Typumwandlungen verwendet werden darf.

    class test
    {
    public:
      explicit test(int) {...}//exklizite Umwandlung von int
    };
    
    void func(test p)
    {...}
    
    int main()
    {
      test t1(15);//OK, expliziter Aufruf
      func(test(15));//OK
    
      test t2 = 0;//verboten - implizite Umwandlung
      func(15);//ebenfalls verboten
    }
    


  • Danke!



  • CStoll schrieb:

    ...

    test t2 = 0;//verboten - implizite Umwandlung
    

    ...

    Interessant !!! Wusste ich noch nicht - ich dachte immer, bei dieser "assignment-is-initialization"-Regel würde IMMER erst "umgewandelt" (also "Typ B1 = B2" als "Typ B1(B2)" interpretiert....

    Wieder was gelernt !

    Danke,

    Simon2.



  • Simon2 schrieb:

    CStoll schrieb:

    ...

    test t2 = 0;//verboten - implizite Umwandlung
    

    ...

    Interessant !!! Wusste ich noch nicht - ich dachte immer, bei dieser "assignment-is-initialization"-Regel würde IMMER erst "umgewandelt" (also "Typ B1 = B2" als "Typ B1(B2)" interpretiert....

    Ich würde dringend davon abraten dies als "assignment-is-initialization" zu bezeichnen. Zum einen hat diese Regel bereits einen eindeutigen Namen, nämlich copy-initialization, und da hier zum anderen keine Zuweisung stattfindet, wäre der Begriff auch verwirrend.

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=copyvsdirect#Answ



  • HumeSikkins schrieb:

    ...copy-initialization...

    DEN Ausdruck habe ich auch gesucht (und mich vertan).

    Gruß,

    Simon2.



  • Simon2 schrieb:

    ich dachte immer, bei dieser "assignment-is-initialization"-Regel würde IMMER erst "umgewandelt" (also "Typ B1 = B2" als "Typ B1(B2)" interpretiert....

    Ja, von der Wirkung sind "Typ B1=B2;" und "Typ B1(B2);" identisch, aber mit dem winzigen Unterschied - das erste gilt als implizite Typumwandlung, das zweite als explizite.



  • Danke, 👍
    genau DEN Unterschied habe ich bislang nicht gekannt.

    Gruß,

    Simon2.



  • nun kenn ich auch den unterschied 😃



  • hab jetz auch mal ne Frage:

    Wozu ist implizit verbieten gut? Also wofür ist explicit Funktion gut?



  • x schrieb:

    hab jetz auch mal ne Frage:

    Wozu ist implizit verbieten gut? Also wofür ist explicit Funktion gut?

    Wenn Du z.B. nen Vektor hast, den Du mit einer Kapazität oder Größe initialisieren kannst. Folgendes sähe idiotisch aus:

    std::vector vec = 10;
    

    Denn Du willst dem Vektor ja keine 10 zuweisen. Aber folgendes ist legitim:

    std::vector vec(10);
    

    Aber das ist nur eye candy. Wichtiger ist die implizite Umwandlung beim Auflösen von Überladungen. Wenn eine Funktion 'f' einen Vektor akzeptiert, dann ist es halt trotzdem unsinnig, wenn man folgenden Code schreiben könnte:

    f(10);
    

    Daher wird sowas unterbunden.



  • x schrieb:

    hab jetz auch mal ne Frage:

    Wozu ist implizit verbieten gut? Also wofür ist explicit Funktion gut?

    das ist ein hübsches beispiel

    struct vect3d
    {
     float x, y, z;
    
     vect3d(float nx, float ny = 2.0f, float nz = 3.0f) : //böse :-), mit explizit schreit der compiler @ compiletime
       x(nx), y(ny), z(nz)
     { ... }
    };
    
    int main(int, char**)
    {
     vect3d v = 10.0f; //unübersichtliches konstrukt für leute die den code nicht geschrieben haben
    }
    


  • Wenn du implizite Konvertierung erlaubst geht schnell die Übersicht im Code flöten. Da kann schonmal wild rumkonvertiert werden ohne dass du das bemerkst oder beabsichtigst.


Anmelden zum Antworten