Ich dachte, dass Konstruktoren die Kontrolle der Initialisierung und operator = Funktionen in C ++ steuern. Warum funktioniert dieser Code?
%Vor% In der dritten Zeile der Hauptfunktion weise ich ein int
einem Objekt der Klasse Deg
zu. Da ich keine Funktion operator=(int)
habe, dachte ich, dass dies sicherlich fehlschlagen würde ... aber stattdessen ruft sie den Konstruktor Deg(int a)
auf. Beherrschen Konstruktoren auch die Zuweisung?
Dies wird als implizite Typumwandlung bezeichnet. Der Compiler sucht nach einem Konstruktor, der direkt von dem Typ, den Sie zuweisen, zu dem Typ wechselt, den Sie zuweisen möchten, und ruft ihn auf. Sie können verhindern, dass dies geschieht, indem Sie das Schlüsselwort explicit
vor dem Konstruktor hinzufügen, das Sie nicht implizit aufrufen möchten, wie folgt:
explicit Deg(int a) : d(a) {}
Um JonMs Antwort zu klären:
Für die Zeile d = 3
ist ein Zuweisungsoperator beteiligt. 3
wird implizit in ein Deg
konvertiert, wie JonM sagte, und dann wird Deg
mit Hilfe des vom Compiler generierten Zuweisungsoperators (der standardmäßig ein Mitglied verwendet) an d
zugewiesen -Wise-Zuordnung). Wenn Sie die Zuweisung verhindern möchten, müssen Sie einen privaten Zuweisungsoperator deklarieren (und ihn nicht implementieren):
Tags und Links class c++ initialization operator-overloading