Was sind alle Member-functionen, die der Compiler für eine class erzeugt? Passiert das die ganze Zeit?

Was sind alle Member-functionen, die der Compiler für eine class erzeugt? Passiert das die ganze Zeit? wie Destruktor. Meine Sorge ist, ob es für alle classn erstellt wird, und warum ist Standardkonstruktor benötigt?

    C ++ 98/03

    Wenn sie benötigt werden,

    1. Der Compiler generiert einen Standardkonstruktor für Sie, sofern Sie keinen eigenen Konstruktor deklarieren.
    2. Der Compiler generiert einen Kopierkonstruktor für Sie, sofern Sie nicht Ihren eigenen deklarieren.
    3. Der Compiler generiert einen Kopierzuweisungsoperator für Sie, sofern Sie nicht Ihren eigenen deklarieren.
    4. Der Compiler generiert einen Destruktor für Sie, sofern Sie nicht einen eigenen deklarieren.

    Wie Péter in einem hilfreichen Kommentar sagte, werden all diese nur vom Compiler generiert, wenn sie benötigt werden . (Der Unterschied ist, dass, wenn der Compiler sie nicht erstellen kann, das OK ist, solange sie nicht verwendet werden.)


    C ++ 11

    C ++ 11 fügt die folgenden Regeln hinzu, die auch für C ++ 14 gelten (credits to towi, siehe diesen Kommentar ) :

    • Der Compiler generiert den Move- Konstruktor if
      • Es gibt keinen vom Benutzer deklarierten Kopierkonstruktor und
      • Es gibt keinen vom Benutzer deklarierten Kopierzuweisungsoperator und
      • Es gibt keinen vom Benutzer deklarierten Zuweisungsoperator und
      • Es gibt keinen vom Benutzer deklarierten Destruktor ,
      • es ist nicht als gelöscht markiert,
      • und alle Mitglieder und Basen sind beweglich .
    • Ähnlich für den Zuweisungsoperator : Er wird generiert, wenn kein Benutzer definiert ist
      • Es gibt keinen vom Benutzer deklarierten Kopierkonstruktor und
      • Es gibt keinen vom Benutzer deklarierten Kopierzuweisungsoperator und
      • Es gibt keinen vom Benutzer deklarierten Move- Konstruktor und
      • Es gibt keinen vom Benutzer deklarierten Destruktor ,
      • es ist nicht als gelöscht markiert,
      • und alle Mitglieder und Basen sind beweglich .

    Beachten Sie, dass diese Regeln etwas ausgeklügelter sind als die C ++ 03-Regeln und in der Praxis mehr Sinn ergeben.

    Für ein einfacheres Verständnis dessen, was das oben ist, hier die Dinge für Thing :

     class Thing { public: Thing(); // default constructor Thing(const Thing&); // copy c'tor Thing& operator=(const Thing&); // copy-assign ~Thing(); // d'tor // C++11: Thing(Thing&&); // move c'tor Thing& operator=(Thing&&); // move-assign }; 

    Und wenn Sie ein C ++ – Anfänger sind, dann sollten Sie ein Design in Betracht ziehen, bei dem Sie keines der letzten fünf implementieren müssen, aka The Rule Of Zero (von Martinho Fernandes ) .

    Meinst du “definiert” durch “erstellt”?

    $ 12.1 – “Der Standardkonstruktor (12.1), der Kopierkonstruktor und der Kopierzuweisungsoperator (12.8) und der Destruktor (12.4) sind spezielle Elementfunktionen.

    Wenn ‘erstellt’ bedeutet ‘definiert’ dann, hier sind die wichtigen Teile aus dem C ++ Standard.

    – Ein implizit deklarierter Standardkonstruktor für eine class wird implizit definiert, wenn er zum Erstellen eines Objekts seines classntyps (1.8) verwendet wird.

    -Wenn eine class keinen vom Benutzer deklarierten Destruktor hat, wird ein Destruktor implizit deklariert. Ein implizit deklarierter Destruktor ist implizit definiert, wenn damit ein Objekt seines classntyps zerstört wird.

    -Wenn die classndefinition einen Kopierkonstruktor nicht explizit deklariert, wird einer implizit deklariert. Ein implizit deklarierter Kopierkonstruktor ist implizit definiert, wenn er verwendet wird, um ein Objekt seines classntyps aus einer Kopie eines Objekts seines classntyps oder eines von seinem classntyp abgeleiteten classntyps zu initialisieren.

    – Wenn die classndefinition keinen Kopierzuweisungsoperator explizit deklariert, wird einer implizit deklariert. Ein implizit deklarierter Kopierzuweisungsoperator wird implizit definiert, wenn einem Objekt seines classntyps ein Wert seines classntyps oder ein Wert eines von seinem classntyp abgeleiteten classntyps zugewiesen wird.

    Wenn der Compiler nicht vom Benutzer implementiert wird, fügt er der class standardmäßig einige Memberfunktionen hinzu. Diese heißen die großen Vier:

    • Standardkonstruktor
    • Konstruktor kopieren
    • Kopieroperator (Zuweisung)
    • Destruktor

    Abhängig von den Typen der Mitglieder und der aufgeführten Mitgliedsfunktion, die Sie selbst angeben, werden diese nicht alle generiert.

    Andere Antworten haben Ihnen gesagt, was erstellt wurde und dass der Compiler sie nur erzeugen kann, wenn sie verwendet werden.

    Meine Sorge ist, ob es für alle classn erstellt wird …

    Warum besorgt? Denken Sie daran, unerwünschten Code in der ausführbaren Datei zu erstellen? Unwahrscheinlich, aber Sie können leicht genug mit Ihrer Umgebung überprüfen.

    Oder war Ihre Sorge, dass es keinen Konstruktor erstellen könnte, wenn Sie einen wollen? Sie müssen sich keine Sorgen machen … Sie werden immer erstellt, wenn sie benötigt werden und nicht vom Benutzer bereitgestellt werden.

    … und warum wird der Standardkonstruktor benötigt?

    Weil classn möglicherweise Objekte mit eigenen Destruktoren in sich haben, die systematisch aufgerufen werden müssen. Zum Beispiel, gegeben …

     struct X { std::string a; std::string b; }; 

    Der Standarddestruktor stellt sicher, dass die Destruktoren für a und b ausgeführt werden.