Wann ist es sicher, dieses - & gt; in Konstruktor und Destruktor
Habe ich nicht in der Lage, eine schlüssige Antwort auf dieses so weit. Wann ist es sicher zu nennen this->
innerhalb eines Objekts. Und insbesondere vom Konstruktor und Destruktor.
Und auch, wenn Sie mit öffentlicher Vererbung. Ist es sicher zu bedienen und downcasting auf das Ergebnis von diesem Aufruf?
So zum Beispiel:
class foo
{
foo():
a(),
b(this->a)//case 1
{
this-> a = 5; //case 2
}
int a;
int b;
};
class bar: public baz
{
bar():
baz(this)//case 3 - assuming baz has a valid constructor
{
}
}
Und schließlich den unmöglichsten eine
foo()
{
if(static_cast<bar*>(this));//case 4
}
Welche von den oben genannten Fällen legal sind?
Hinweis: ich bin mir bewusst, dass viele der Praktiken, die oben sind nicht ratsam.
InformationsquelleAutor der Frage laurisvr | 2015-05-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Innerhalb einer nicht-statischen Memberfunktion
this
Punkte auf das Objekt, das die Funktion aufgerufen wurde. Es ist sicher zu verwenden, solange, dass ein gültiges Objekt.Innerhalb des Körpers von einem Konstruktor oder Destruktor, gibt es ein gültiges Objekt der Klasse, die derzeit gebaut wird. Allerdings, wenn dies ist die Basis sub-Objekt einige abgeleitete Klasse, dann nur in der base sub-Objekt gültig ist, so ist es in der Regel nicht sicher, down-cast und versuchen Sie den Zugriff auf Mitglieder der abgeleiteten Klasse. Aus dem gleichen Grund müssen Sie vorsichtig sein, den Aufruf virtueller Funktionen, da Sie versendet werden nach der Klasse erzeugt oder zerstört werden, nicht die final overrider.
Innerhalb der initialiser Liste einen Konstruktor, müssen Sie vorsichtig sein, nur für access-Mitglieder, die initialisiert wurden; das heißt, die Mitglieder erklärt, vor der man derzeit initialisiert.
Up-casting, um eine Basis-Klasse ist immer sicher, da base sub-Objekte sind immer initialisiert ersten.
Für die spezifischen Beispiele, die Sie gerade Hinzugefügt haben, die Frage:
a
initialisiert wurde. Initialisierunga
mit dem Wert vonb
wäre undefiniert, dab
initialisiert ist nacha
.foo
Konstruktor. Wenn es den gäbe, dann würde es davon abhängen, was diesen Konstruktor mit ihm Tat - ob oder nicht es versucht, Zugriff auf Mitglieder, bevor Sie initialisiert wurden.)
aber gefährlich, wenn Sie versucht haben, verwenden Sie den Mauszeiger auf das Objekt zugreifen.this
noch nicht auf eine gültigebar
Objekt (nur diefoo
Teil initialisiert wurde), um den Zugriff auf Mitglieder derbar
geben könnte Undefiniertes Verhalten. Einfach überprüfen, ob der Zeiger ungleich null ist in Ordnung, und wird es immer gebentrue
(ob oder ob nicht, die Sie anwenden, eine sinnlose cast).InformationsquelleAutor der Antwort Mike Seymour
Es ist ein guter Einstieg in die C++ - super-faq:
https://isocpp.org/wiki/faq/ctors#using-this-in-ctors
InformationsquelleAutor der Antwort Goz
Der this-Zeiger kann in jeder nicht-statischen member-Funktion ...
§9.3.2/1
... wobei Konstruktoren und Destruktoren sind member-Funktionen ...
§12/1
... die sind nicht statisch.
§12.1/4
§12.4/2
So
this
ist verfügbar in Konstruktoren und Destruktoren. Aber es gibt Einschränkungen (insbesondere in Bezug auf die Nutzung vonthis
innerhalb der Initialisierungsliste).(Hinweis: im Inneren der Konstruktor /Destruktor-Körper, die Initialisierung für alle Unterobjekte und Mitglieder ist abgeschlossen, und Sie sind zugänglich; siehe weiter unten).
1. Nur access-Objekt erstellt wird (oder Unterobjekte) durch
this
.§12.1/14
2. Nicht aufrufen virtueller Funktionen überschreiben in einer abgeleiteten Klasse in der Basis-Konstruktor
§12.7/4
3. Nicht anwenden
dynamic_cast
zu werfenthis
in keinem anderen Typ als den Typ im Bau oder in jedem base-Typ davon.§12.7/6
4. Umwandlung von
this
in die base Typ Zeiger ist nur erlaubt, durch die Wege, die aus der konstruierten Basis-Typen.§12.7/3
Zugriff auf die sub-Objekte und Elemente in der Initialisierungsliste und den Konstruktor Körper
Im Prinzip können Sie den Zugriff aufgebaut /initialisierte Objekte aus der Initialisierungsliste, wenn Ihre Initialisierung erfolgt vor dem Zugriff auf Sie.
Die Reihenfolge der Initialisierung ist
§12.6.2/10
InformationsquelleAutor der Antwort Pixelchemist