explicit ctor



  • Hallo Leute. Bin vorhin in einer vector-Implementierung über einen Konstruktor gestolpert der explicit war. Was bedeutet dies?



  • vector hat einen Konstruktor, der als einziges Argument int (oder lass es size_t sein) nimmt. Dadurch existiert eine implizite Umwandlung von int nach vector, was manchmal überraschende Effekte haben kann, oder bei überladenen Funktionen zu Mehrdeutigkeiten führen kann. Wenn diese Umwandlung nicht beabsichtigt ist, sollte man den Konstruktor explizit machen, was einen dann zwingt, vector<foo>(20) zu schreiben.
    Bei Konstruktoren ohne oder mit mehr als 2 (nicht optionalen) Argumenten ist das natürlich nicht notwendig.



  • Das verhindert, dass der Compiler implizit einen Typ in diese Klasse umwandelt:

    class foo
    {
        public:
        explicit foo(int x);
    };
    
    //...
    foo Objekt(5); // Okay
    Objekt=5; // Nicht okay
    

    In diesem Fall ist es egal. Doch kann es ohne explicit leicht zu Mehrdeutigkeiten kommen. Vor allem wenn die Klasse noch einen "operator int" definiert.

    MfG SideWinder



  • Wieder zu spät 😞

    MfG SideWinder



  • SideWinder schrieb:

    Das verhindert, dass der Compiler implizit einen Typ in diese Klasse umwandelt:
    [cpp]
    class foo
    {
    public:
    explicit foo(int x);
    };

    //...
    foo Objekt(5); // Okay
    Objekt=5; // Nicht okay
    [/code]

    Außerdem verhindert es auch die Copy-Initialisierung. Sprich:
    [cpp]
    // ohne explicit
    foo Objekt = 5; // ok
    // mit explicit
    foo Objekt = 5; // geht nicht!
    [/cpp]

    @Side
    Interessante Namenskonvention die du da verwendest. Irgendwie so, äh, twisted 😃



  • :D, naja ich liebe halt dieses Deunglisch ;).

    MfG SideWinder



  • SideWinder schrieb:

    :D, naja ich liebe halt dieses Deunglisch ;).

    darum ging es doch garnicht. 😡


Anmelden zum Antworten