2016-04-11 6 views
0

ich über einige Code lief, die wie folgt aussah:Implizite Konvertierung von int zu einer Klasse Typ

class Cents 
{ 
private: 
    int m_nCents; 
public: 
    Cents(int nCents) : m_nCents(nCents) 
    { 
    } 
}; 

int main(){ 
    Cents c = 0; // why is this possible? 
} 

Warum ist es möglich, von int nach Typ der Klasse Cents zu konvertieren? Wird der Kopierkonstruktor in diesem Fall aufgerufen?

+0

Sie haben es getaggt: ** implizite Konvertierung **. – meagar

+0

Ich dachte, implizite Konvertierung wurde nur für grundlegende Typen (anscheinend nicht). Also wird 0 in den Typ Cents konvertiert und c wird mit dem Kopierkonstruktor initialisiert? Wenn ja, was passiert, wenn 0 in Cents konvertiert wird? –

+0

Es gibt keinen "Kopierkonstruktor" in Ihrem Code, ich bin mir nicht sicher, woher Sie das bekommen. Es gibt nur einen regulären alten Konstruktor der Nicht-Kopie-Variante. Und da Ihr Konstruktor einen einzelnen Wert akzeptiert, wird er in die Liste der möglichen impliziten Konvertierungen von diesem Wert in Ihren Klassentyp aufgenommen. – meagar

Antwort

1

Warum ist es möglich, von Int zu Art von Klasse Cents zu konvertieren?

Es ist erlaubt, weil es manchmal handlich ist. Aber es kann auch problematisch sein: Deshalb können Sie solche impliziten Konstruktionen verbieten, indem Sie den Klassenkonstruktor explicit machen.

Wird der Kopierkonstruktor auch in diesem Fall aufgerufen?

Da es einen R-Wert ist, würde der Anruf zu einem Umzug Konstruktor/Zuordnung (was zu einer Kopie Ctor/Zuordnung Rückfall könnte); aber der Compiler wird das wahrscheinlich weglassen. Wenn Sie das explizit geschrieben haben, entspricht das:

Cents c = Cents(0);