Quelles sont toutes les fonctions membres créées par compilateur pour une classe? Ça arrive tout le temps?

quelles sont toutes les fonctions-membres créées par compilateur pour une classe? Ça arrive tout le temps? comme destructeur. Mon problème est de savoir si elle est créée pour toutes les classes, et pourquoi le constructeur par défaut est-il nécessaire?

52
demandé sur sbi 2010-09-17 13:48:04

4 réponses

C++98/03

si elles sont nécessaires,

  1. le compilateur générera un constructeur par défaut pour vous à moins que vous ne déclariez n'importe quel constructeur de votre propre.
  2. le compilateur générera une copie constructeur pour vous sauf si vous déclarez votre propre.
  3. le compilateur générera un copie opérateur d'affectation pour vous, sauf si vous déclarez votre propre.
  4. le compilateur générera un destructeur pour vous à moins que vous ne déclariez le vôtre.

comme Péter l'a dit dans un commentaire utile, tous ceux-ci ne sont générés par le compilateur quand ils sont nécessaires . (La différence est que, lorsque le compilateur ne peut pas créer, c'est Ok aussi longtemps qu'ils ne sont pas utilisés.)


C++11

C++11 Ajoute les règles suivantes, qui sont également vraies pour C++14 (crédits à towi, voir ce commentaire ) :

  • , Le compilateur génère le déplacer constructeur si
    • il n'y a pas d'utilisateur-déclaré copie constructeur , et
    • il n'y a pas déclaré copie opérateur d'affectation , et
    • il n'y a pas déclaré déplacer opérateur d'affectation et
    • il n'y a pas utilisateur-déclaré destructeur ,
    • il est pas marqué supprimé ,
    • et tous les membres et bases sont mobiles .
  • de même pour la déplacer opérateur d'affectation : Il est généré si aucun utilisateur n'est définir
    • il n'y a pas déclaré copie constructeur , et
    • il n'y a pas déclaré copie opérateur d'affectation , et
    • il n'y a pas déclaré déplacer constructeur et
    • il n'y a pas d'utilisateur-déclaré destructeur ,
    • il est pas marqué supprimé ,
    • et tous les membres et bases sont mobiles .

notez que ces règles sont un peu plus élaborées que les règles c++03 et ont plus de sens dans la pratique.

pour une meilleure compréhension de ce qui est ce qui est ci-dessus les éléments pour 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
};

et comme autre lecture, si vous êtes un débutant en C++, considérez un design qui ne vous oblige pas à implémenter l'un des cinq derniers, A. K. a la Règle du zéro (by Martinho Fernandes ) .

76
répondu sbi 2018-04-09 04:44:37

voulez-vous dire "défini" par "créé"?

$12.1 - "Le constructeur par défaut (12.1), le constructeur de copie et l'opérateur d'assignation de copie (12.8), et le destructeur (12.4) sont spéciales des fonctions membres.

Si "créé" signifie "défini" alors, voici les parties importantes de la norme C++.

-un constructeur par défaut implicitement déclaré pour une classe est implicitement défini quand il est utilisé pour créer un objet de son type de classe (1.8).

-si une classe n'a pas de destructeur déclaré par l'utilisateur, un destructeur est déclaré implicitement. Un implicitement déclarées destructeur est implicitement défini lorsqu'il est utilisé pour détruire un objet de sa classe type.

- si la définition de classe ne déclare pas explicitement un constructeur de copie, On le déclare implicitement. Un implicitement déclarées constructeur de copie est implicitement définie si elle est utilisée pour initialiser un objet de son type de classe à partir d'une copie d'un objet de son type de classe ou d'un type de classe dérivée à partir de son type de classe).

- si la définition de classe ne déclare pas explicitement un opérateur de copie, un opérateur est déclaré implicitement. Un implicitement déclarées copie opérateur d'affectation est implicitement défini lorsqu'un objet de son type de classe est affecté d'une valeur du type de classe ou d'une valeur d'un type de classe dérivée à partir de son type de classe.

2
répondu Chubsdad 2010-09-17 10:00:01

par défaut, s'il n'est pas implémenté par l'utilisateur, le compilateur ajoute quelques fonctions de membre à la classe. On les appelle les quatre grands :

  • constructeur par défaut
  • constructeur de copie
  • copie de l'opérateur (affectation)
  • destructeur

selon les types de membres et la fonction de membre énumérée que vous fournissez vous-même, ceux-ci ne seront pas tous générer.

1
répondu Klaim 2013-12-16 19:06:23

D'autres réponses vous ont dit ce qui est créé, et que le compilateur ne peut les générer que s'il est utilisé.

mon souci est de savoir si elle est créée pour toutes les classes...

pourquoi? Tu penses qu'il crée du code indésirable dans l'exécutable? Peu probable, mais vous pouvez vérifier assez facilement avec votre environnement.

Ou peut-être votre préoccupation était qu'il ne pourrait pas créer un constructeur lorsque vous vous en voulez un? Rien à craindre... ils sont toujours créés si nécessaire et non fourni par l'utilisateur.

...et pourquoi est-constructeur par défaut nécessaires?

parce que les classes peuvent avoir des objets à l'intérieur d'elles avec leurs propres destructeurs qui doivent être systématiquement invoqués. Par exemple, donné...

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

...le destructeur par défaut assure le fonctionnement des destructeurs pour a et B.

0
répondu Tony Delroy 2010-09-17 10:05:21