Die Vorteile der Verwendung eines Zeigers werden von 3DH umrissen: verzögerte Initialisierung, Reduzierung der Header-Abhängigkeiten und Kontrolle über die Lebensdauer des Objekts.
Die sind auch Nachteile. Wenn Sie über ein Zeigerdatenelement verfügen, müssen Sie wahrscheinlich Ihren eigenen Kopierkonstruktor und Zuweisungsoperator schreiben, um sicherzustellen, dass eine Kopie des Objekts ordnungsgemäß erstellt wird. Natürlich müssen Sie auch daran denken, das Objekt im Destruktor zu löschen. Wenn Sie einer vorhandenen Klasse ein Zeigerdatenelement hinzufügen, müssen Sie außerdem daran denken, den Kopierkonstruktor und operator = zu aktualisieren. Kurz gesagt, ein Zeiger Daten Mitglied ist mehr Arbeit für Sie.
Ein weiterer Nachteil ist wirklich die Kehrseite der Kontrolle über die Lebensdauer des Objekts, auf das der Zeiger zeigt. Nicht-Zeiger-Datenelemente werden automatisch zerstört, wenn das Objekt zerstört wird, was bedeutet, dass Sie immer sicher sein können, dass sie existieren, solange das Objekt existiert. Mit dem Zeiger müssen Sie überprüfen, ob es nullptr
ist, was bedeutet, dass Sie auch sicherstellen müssen, dass es auf nullptr
gesetzt wird, wenn es nichts zeigt. All dies zu bewältigen kann leicht zu Fehlern führen.
Schließlich ist der Zugriff auf Nicht-Zeiger-Mitglieder wahrscheinlich schneller, da sie zusammenhängend im Speicher sind. Auf der anderen Seite verursacht der Zugriff auf Zeigerdatenelemente, die auf ein Objekt zeigen, das auf dem Heap zugeordnet ist, wahrscheinlich einen Cache-Fehltreffer, wodurch dieser langsamer wird.
Es gibt keine einzige Antwort auf Ihre Frage. Sie müssen sich Ihr Design ansehen und entscheiden, ob die Vorteile von Zeigerdatenelementen die zusätzlichen Kopfschmerzen überwiegen. Wenn die Reduzierung von Kompilierungszeit und Headerabhängigkeiten wichtig ist, verwenden Sie die pimpl idiom. Wenn Ihr Datenelement in bestimmten Fällen für Ihr Objekt nicht erforderlich ist, verwenden Sie einen Zeiger und weisen Sie ihn bei Bedarf zu. Wenn diese nicht wie zwingende Gründe klingen, und Sie keine zusätzliche Arbeit machen wollen, dann verwenden Sie keinen Zeiger.
Für faul Initialisierung, würde ich 'Boost :: optional' wann immer möglich empfehlen. Es ist sicherer als Zeiger, weil Sie keine Arithmetik ausführen können. –
Aber viele (wie ich) benutzen Boost nicht - das ist also eine sehr plattform- und rahmenunabhängige Art ;-) ... ich benutze zum Beispiel nur Qt :-) – 3DH
Aber die, die 'boost' nicht verwenden sollten :) – GManNickG