64 votes

Qu'est-ce qu'un constructeur non-trivial en C ++?

Je lisais ce http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_de_plain_old_data

Il mentionne un constructeur par défaut trivial, un constructeur de copie trivial, un opérateur d'affectation de copie, un destructeur trivial. Qu'est-ce qui est trivial et non trivial?

75voto

AndreyT Points 139512

Dans des mots simples, un "trivial" spécial fonction membre signifie littéralement une fonction membre qui fait son travail dans un très simple. Le "simple" ne signifie pas la même chose pour les différents types de spécial les fonctions de membres.

Pour un constructeur par défaut et destructeur de l'être "trivial" signifie littéralement "ne rien faire". Pour le constructeur par copie et copie-opérateur d'affectation, d'être "trivial" signifie littéralement "être équivalent simple de la mémoire brute de la copie" (comme la copie avec memcpy).

Si vous définissez un constructeur vous-même, il est considéré comme non négligeable, même si ce n'est pas faire n'importe quoi, donc trivial constructeur doivent être définis implicitement par le compilateur.

Dans l'ordre, pour une fonction membre pour satisfaire les exigences ci-dessus, la classe doit avoir une très simpliste de la structure, il ne doit pas exiger de toute caché initialisations lorsqu'un objet est créé ou détruit, ou cachés interne supplémentaire manipulations lorsqu'il est copié.

Par exemple, si la classe a fonctions virtuelles, il faudra un peu cachés supplémentaires initialisations lorsque les objets de cette classe sont en cours de création (initialiser la table de méthode virtuelle et par exemple), de sorte que le constructeur de cette classe ne sont pas considérés comme triviaux.

Pour un autre exemple, si une classe a virtual classes de base, puis chaque objet de cette classe peut contenir caché des pointeurs qui pointent vers d'autres parties du même objet. Une telle auto-référentielle de l'objet ne peut pas être copié par un simple raw copie de la mémoire de routine (comme memcpy). Extra manipulations sera nécessaire pour ré-initialiser le caché des pointeurs dans la copie. Pour cette raison, le constructeur de copie et de copie opérateur d'affectation pour cette classe ne seront pas considérés comme triviaux.

Pour des raisons évidentes, cette exigence est récursive: tous les objets de la classe (les bases et les membres non statiques) doit également avoir trivial constructeurs.

30voto

Prasoon Saurav Points 47488

Un constructeur de classe A est trivial si toutes les conditions suivantes sont vraies:

  • Il est défini implicitement (compilateur synthétisé)
  • A n'a pas de fonctions virtuelles ni de classes de base virtuelles
  • Toutes les classes de base directes de A ont des constructeurs triviaux
  • Les classes de toutes les données membres non statiques de A ont des constructeurs triviaux

21voto

jogojapan Points 26661

Il y a des réponses correctes déjà, mais ici, c'est la citation de la Norme (qui je cherchais quand je suis tombé sur ce post):

(§12.1/5) Un constructeur par défaut est trivial si il n'est pas fourni par l'utilisateur et si:
- sa classe n'a pas de fonctions virtuelles (10.3) et pas de virtuel classes de base (10.1), et
- aucune non-membre de données statiques de sa classe a un corset ou égal initialiseur, et
- tous les directe les classes de base de sa classe ont trivial constructeurs par défaut, et
- pour tous les non-membres de données statiques de sa classe qui sont de type classe (ou d'une matrice de celui-ci), chaque classe a un trivial constructeur par défaut.

C'est à partir de C++11. C++03 manque le deuxième élément et utilise l'expression déclarée implicitement au lieu des pas fournie par l'utilisateur. Il est par ailleurs identique.

Notez que cette spécification ne couvre trivial constructeurs par défaut. L'attribut mot trivial peut également être utilisé dans différents contextes, par exemple, une copie des constructeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X