Mit dem C++ Schlüsselwort „explicit“ kann man dem Compiler implizite Typumwandlungen verbieten. Dies kann manchmal ja auch ungewollt passieren, wie folgendes Beispiel zeigt:
#include
#include
struct MyClass
{
MyClass(const char* name) : m_Name(name) {}
virtual ~MyClass() {}
const char* Who() const { return m_Name; }
private:
const char* m_Name;
};
struct MyExplicitClass
{
explicit MyExplicitClass(const char* name) : m_Name(name) {}
virtual ~MyExplicitClass() {}
const char* Who() const { return m_Name; }
private:
const char* m_Name;
};
int main()
{
MyClass A("a");
MyExplicitClass B("b");
A = "c"; // ok, hier funktioniert das, aber war das auch so gewollt?
// Auf den ersten Blick zu durchschauen ist diese Zuweisung jedenfalls nicht.
B = "d"; // error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden,
// der einen rechtsseitigen Operanden vom Typ 'const char [2]' akzeptiert (oder
// keine geeignete Konvertierung möglich)
std::cout << "A: " << A.Who() << std::endl;
std::cout << "B: " << B.Who() << std::endl;
return 0;
}