c ++: Wann sind Zeiger zu verwenden?
Nach der Lektüre einige tutorials kam ich zu dem Schluss, dass sollte man immer Pointer für Objekte. Aber ich habe auch gesehen, ein paar Ausnahmen beim Lesen einiger QT-tutorials ( http://zetcode.com/gui/qt4/painting/ ), wo QPaint Objekt wird auf dem Stapel erzeugt. So, jetzt bin ich verwirrt. Wann sollte ich die Zeiger verwenden?
InformationsquelleAutor der Frage Jamol | 2009-03-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht wissen, Wann Sie verwenden sollten, Zeiger einfach nicht mit Ihnen.
Wird es sichtbar, wenn Sie Sie benötigen, jede situation ist anders. Es ist nicht einfach die Summe auf den Punkt, wenn Sie verwendet werden sollten. Nicht in die Gewohnheit, immer mit Zeigern für Objekte', das ist sicherlich schlecht beraten.
InformationsquelleAutor der Antwort CiscoIPPhone
Wichtigsten Gründe für die Verwendung von Zeigern:
InformationsquelleAutor der Antwort bayda
Es ist mir nicht klar, ob Ihre Frage dabei ist ptr-to-obj vs stack-basierte -, obj-oder ptr-zu-obj-vs-Referenz-zu-obj. Es gibt auch verwendet, fallen Sie nicht in jeder Kategorie.
Bezüglich vs-stack, das scheint mir schon überzogen vor. Mehrere Gründe, der offensichtlichste ist die Lebensdauer des Objekts.
Bezüglich vs Referenzen, bemühen Sie sich stets um Verweise verwenden, aber es gibt Dinge, die Sie tun können, nur mit ptrs, zum Beispiel (es gibt viele) verwendet:
Am wichtigsten ist, Zeiger (und Verweise, im Gegensatz zu automatischen - /stack-basierte & statische Objekte), Unterstützung für Polymorphie. Ein Zeiger auf eine Basisklasse tatsächlich zu einem Punkt abgeleitete Klasse ist. Dies ist eine der Grundlagen der OO-Verhalten unterstützt in C++.
InformationsquelleAutor der Antwort Dan
First off, die Frage ist falsch: das dilemma liegt nicht zwischen Zeiger und stack, aber zwischen heap und stack. Sie können ein Objekt auf dem stack, und übergeben Sie den Zeiger auf das Objekt. Ich gehe davon aus, was Sie wirklich Fragen ist, ob Sie sollten deklarieren Sie einen Zeiger auf Klasse oder eine Instanz der Klasse.
Die Antwort ist, es hängt davon ab, was Sie wollen mit dem Objekt. Wenn die Objekt zu existieren, nachdem die Kontrolle lässt sich die Funktion, dann verwenden Sie einen Zeiger, und erstellen Sie das Objekt auf dem heap. Sie tun dies zum Beispiel, wenn Sie Ihre Funktion zurückgegebene Zeiger auf das erzeugte Objekt oder das Objekt hinzufügen, um eine Liste, die erstellt wurde, bevor Sie Ihre Funktion.
Auf der anderen Seite, wenn die Objekte, die lokal zu der Funktion, dann ist es besser, es auf den stack. Dies ermöglicht dem compiler rufen Sie den Destruktor, wenn das Steuerelement verlässt die Funktion.
InformationsquelleAutor der Antwort ajanicij
Welche tutorials wären das? Eigentlich gilt die Regel, dass Sie sollten Zeiger verwenden, nur wenn Sie unbedingt müssen, das ist ganz selten. Sie müssen Lesen Sie ein gutes Buch über C++, wie Accelerated C++ von Koenig & Moo.
Edit: ein bisschen Zu klären - zwei Fälle, in denen Sie würde nicht verwenden Sie einen Zeiger (string ist hier als Vorbild - gleiche würde für jede andere Art):
InformationsquelleAutor der Antwort
Haben Sie in der Regel die Verwendung von Zeigern in den folgenden Szenarien:
Benötigen Sie eine Sammlung von Objekten, die gehören zu unterschiedlichen Klassen (die in den meisten Fällen werden Sie eine gemeinsame Basis).
Müssen Sie einen stack-allokierten Sammlung von Objekten so groß, dass es wahrscheinlich die Ursache stacküberlauf.
Müssen Sie eine Datenstruktur, können die Anordnung der Objekte schnell wie eine verkettete Liste, Baum ar ähnlich.
Müssen Sie einige komplexe Logik der lifetime-management für Ihr Objekt.
Benötigen Sie eine Daten-Struktur, die ermöglicht die direkte navigation von Objekt zu Objekt - wie eine verkettete Liste, Baum oder jede andere Grafik.
InformationsquelleAutor der Antwort sharptooth
Zusätzlich Punkte zu anderen stellen (insb. w.r.t. die Kontrolle der Lebensdauer von Objekten), wenn Sie zum behandeln von NULL-Objekten, die Sie verwenden sollten, Zeiger, keine Referenzen. Es ist möglich, erstellen Sie eine NULL-Referenz durch typecasting, aber es ist generell eine schlechte Idee.
InformationsquelleAutor der Antwort Mr Fooz
In der Regel die Verwendung von Zeigern /Referenzen auf Objekte, wenn:
Weitergabe zu anderen Methoden
erstellen Sie eine große Palette (ich bin mir nicht sicher, was der normale stack-Größe ist)
Verwenden den stack, wenn:
Erstellen Sie ein Objekt, das lebt und stirbt innerhalb der Methode
Das Objekt die Größe eines CPU-register oder kleiner
InformationsquelleAutor der Antwort LegendLength
Ich eigentlich Pointer in dieser situation:
Bevor ich verwendete Referenz Mitgliedern, initialisiert der Konstruktor, aber der compiler hat ein problem beim kopieren von Konstruktoren, Zuweisungsoperatoren, und die Menge.
Dave
InformationsquelleAutor der Antwort Dave Van den Eynde
mit Zeigern verbunden ist, mit zwei orthogonalen Dinge:
Dynamische Zuordnung. Im Allgemeinen ordnen Sie dynamisch, wenn das Objekt bestimmt ist, länger zu Leben, dass der Umfang, in dem es erstellt wurde. Solch ein Objekt ist eine Ressource, die Eigentümer müssen eindeutig festgelegt sein (meist irgendeine Art von smart pointer).
Zugriff durch Adresse (unabhängig davon, wie das Objekt erstellt wurde). In diesem Zusammenhang Zeiger bedeutet nicht Eigentum. Ein solcher Zugriff erforderlich ist, wenn:
Den #1 und #2 kann auftreten, in verschiedenen Konfigurationen, zum Beispiel können Sie sich vorstellen, dynamisch zugewiesenen Objekt zugegriffen, auf den der pointer, aber so könnte das Objekt auch durch Verweis übergeben, um eine Funktion zu. Sie können auch das get-Zeiger auf ein Objekt, das erstellt wird, auf dem stack etc.
InformationsquelleAutor der Antwort oo_olo_oo
Pass-by-value mit gut benommen kopierbaren Objekten ist der Weg zu gehen für eine große Menge an code.
Wenn Geschwindigkeit wirklich wichtig ist, verwenden Sie als Verweis übergeben, wo Sie können, und schließlich die Verwendung von Zeigern.
InformationsquelleAutor der Antwort dicroce
Wenn möglich verwenden Sie niemals Zeiger. Verlassen Sie sich auf pass by reference oder wenn Sie gehen, um eine Struktur oder Klasse, die davon ausgehen, dass Ihr compiler return-Wert-Optimierung. (Sie haben zu vermeiden, bedingte Konstruktion der zurückgegebenen Klasse aber).
Gibt es einen Grund, warum Java keine Zeiger. C++ braucht Sie nicht. Wenn Sie vermeiden, Ihre Nutzung erhalten Sie den zusätzlichen Vorteil der automatischen Objekt-Zerstörung, wenn das Objekt Spielraum. Ansonsten wird sich der code Erzeugung-Speicher-Fehler der verschiedenen Arten. Speicherlecks kann sehr schwierig sein zu finden und kommen Häufig in C++ durch unbehandelte Ausnahmen.
Wenn du Zeiger verwenden, betrachten wir einige der smart-pointer-Klassen, wie auto_ptr. Automatische Zerstörung von Objekten ist mehr als nur die Freigabe der zugrunde liegenden Speicher. Es ist ein Konzept, das als RAII. Einige Objekte erfordern zusätzlich die übergabe, die auf Zerstörung aus. z.B. Mutexe und schließen von Dateien etc.
InformationsquelleAutor der Antwort Matt
Zeiger verwenden, wenn Sie nicht möchten, dass Ihr Objekt zerstört werden, wenn der stack-frame wird geleert.
Verwenden Sie Referenzen für die übergabe von Parametern, wo möglich.
InformationsquelleAutor der Antwort Mark Ingram
Sprechen über C++ erstellte Objekte auf dem stack nicht verwendet werden, wenn das Programm verlassen hat den Zweck, für den er erstellt wurde. So im Allgemeinen, wenn Sie wissen, dass Sie brauchen nicht eine variable aus der Vergangenheit eine Funktion oder in der Vergangenheit eine enge Klammer, die Sie erstellen können, es auf den stack.
Sprechen über Qt-spezifisch Qt-hilft, den Programmierer von der Handhabung viel von der Speicherverwaltung heap-Objekte. Für Objekte, die abgeleitet sind von
QObject
(fast alle Klassen mit dem Präfix "Q
"), Konstruktoren nehmen einen optionalen parameter parent. Der Elternteil, dann besitzt das Objekt, und wenn das übergeordnete Element gelöscht, werden alle owned-Objekte werden ebenfalls gelöscht. Im wesentlichen in der Verantwortung der Kinder, die der Vernichtung übergeben wird, wird das parent-Objekt. Bei der Verwendung dieses Mechanismus, KindQObject
s sein muss auf dem heap erstellt.Kurz gesagt, in Qt können Sie ganz einfach erstellen Sie Objekte auf dem heap, und solange man ein gutes Elternteil ist, haben Sie nur sorgen über die Zerstörung der Eltern. Im Allgemeinen C++, jedoch müssen Sie daran denken, zu zerstören, heap-Objekte oder verwenden Sie smart-Pointer.
InformationsquelleAutor der Antwort swongu