c++ reference - Was sind POD-Typen in C ++?




4 Answers

POD steht für Plain Old Data - also eine Klasse (unabhängig davon, ob sie mit dem Schlüsselwort struct oder der Schlüsselwortklasse definiert wurde) ohne Konstruktoren, Destruktoren und virtuelle Member-Funktionen. Wikipedia Artikel über POD geht ein bisschen mehr ins Detail und definiert es als:

Eine einfache alte Datenstruktur in C ++ ist eine Aggregatklasse, die nur PODS als Member enthält, keinen benutzerdefinierten Destruktor, keinen benutzerdefinierten Kopierzuweisungsoperator und keine nichtstatischen Elemente vom Typ Zeiger zu Member aufweist.

Weitere Details finden Sie in dieser Antwort für C ++ 98/03 . C ++ 11 änderte die Regeln um POD, entspannte sie sehr und erforderte daher eine Antwort auf diese Frage .

documentation 11

Ich bin diesen Begriff POD-Typ ein paar Mal begegnet. Was heißt das?




Plain alte Daten

Kurz gesagt, es sind alle eingebauten Datentypen (zB int , char , float , long , unsigned char , double usw.) und alle Aggregationen von POD Daten. Ja, es ist eine rekursive Definition. ;)

Um es klarer zu sagen, ein POD ist das, was wir 'a struc' nennen.




Ein POD-Objekt (plain old data) hat einen dieser Datentypen - einen grundlegenden Typ, einen Zeiger, eine Union, eine Struktur, ein Array oder eine Klasse - ohne Konstruktor. Umgekehrt ist ein Nicht-POD-Objekt eines, für das ein Konstruktor existiert. Ein POD-Objekt beginnt seine Lebensdauer, wenn es Speicher mit der richtigen Größe für seinen Typ erhält und seine Lebensdauer endet, wenn der Speicher für das Objekt entweder erneut verwendet oder freigegeben wird.

PlainOldData-Typen dürfen auch keines haben von:

  • Virtuelle Funktionen (entweder eigene oder vererbte)
  • Virtuelle Basisklassen (direkt oder indirekt).

Eine losere Definition von PlainOldData enthält Objekte mit Konstruktoren; aber schließt diejenigen mit virtuellem etwas aus. Das wichtige Problem bei PlainOldData-Typen ist, dass sie nicht polymorph sind. Vererbung kann mit POD-Typen durchgeführt werden, sollte jedoch nur für ImplementationInheritance (Code-Wiederverwendung) und nicht für Polymorphismus / Subtyping erfolgen.

Eine allgemeine (wenn auch nicht streng korrekte) Definition ist, dass ein PlainOldData-Typ alles ist, das keine VeeTable hat.




Mit C ++ bedeutet Plain Old Data nicht nur, dass Dinge wie int, char usw. die einzigen verwendeten Typen sind. Plain Old Data bedeutet in der Praxis, dass Sie eine Struktur von einem Speicherort im Speicher zu einem anderen memcpy nehmen können und die Dinge werden genau so funktionieren, wie Sie es erwarten (dh nicht explodieren). Dies wird unterbrochen, wenn Ihre Klasse oder eine Klasse, die Ihre Klasse enthält, als Mitglied einen Zeiger oder eine Referenz oder eine Klasse mit einer virtuellen Funktion besitzt. Im Wesentlichen, wenn Zeiger irgendwo beteiligt sein müssen, sind es keine einfachen alten Daten.




Related