Chris Codeblog

Tipps, Tricks & Tutorials rund ums Programmieren

[C++] explicit Keyword

In diesem Beitrag geht es schon wieder um ein Keyword. Dieses mal explicit. explicitist eigentlich relativ einfach und schnell erklärt.

Habt ihr schonmal etwas von einem „converting constructor“ gehört? Nein? Ich früher auch nicht. Beispiel: Der Konstruktor einer Klasse nimmt ein Argument. Diese Klasse wird in einer Funktion als Übergabeparameter verwendet. Es wird an die Funktion aber nur der Typ, der im Konstruktor der Klasse verwendet wird übergeben -> Der Compiler verwendet den Konstruktor der Klasse und erzeugt ein entsprechendes Objekt.

Ein kleines Beispiel im Code um das ganze etwas zu vereinfachen:

class Person {
private:
    std::string name_;

public:
    Person(std::string name)
    : name_{std::move(name)} {
        std::cout << "Konstruktor mit " << this->name_ << " aufgerufen" << std::endl;
    }

    std::string get_name() { return this->name_; };
};

void printPerson(Person p) {
    std::cout << p.get_name() << std::endl;
}

int main() {
    // String initialisieren
    std::string name{"Max Mustermann"};
    // Funktion mit std::string statt Person aufrufen
    // -> es wird implizit ein Objekt "Person" erzeugt
    printPerson(name);
    
    /*
     * Ausgabe des Aufrufs von Zeile 21:
     * Konstruktor mit Max Mustermann aufgerufen
     * Max Mustermann
     */

    return 0;
}

In der main-Funktion wird ein std::string erzeugt. Dieser wird an die Funktion printPerson übergeben. Das funktioniert, da der Compiler ein Objekt vom Typ `Person` erzeugt, dieses Objekt wird an die Funktion printPerson übergeben und nach dem die Funktion abgearbeitet wurde wieder freigegeben.

Und was ist mit explicit?

Das kommt hier ins Spiel. Mit explicit sagt man dem Compiler, dass eine Implizite Umwandlung nicht erwünscht ist:

class Person {
private:
    std::string name_;

public:
    explicit Person(std::string name)
    : name_{std::move(name)} {
        std::cout << "Konstruktor mit: " << this->name_ << " aufgerufen" << std::endl;
    }

    std::string get_name() { return this->name_; };
};

void printPerson(Person p) {
    std::cout << p.get_name() << std::endl;
}

int main() {
    std::string name{"Max Mustermann"};
    // Folgende Zeile kann nicht mehr kompiliert werden, da eine implizite Umwandlung
    // nicht mehr erlaubt ist
    printPerson(name);

    Person p{"Marina Musterfrau"};
    // Die Funktion kann nur noch wie hier mit einer richtigen Instanz der Klasse
    // aufgerufen werden.
    printPerson(p);

    return 0;
}
[C++] explicit Keyword

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen