2016-04-14 5 views
-2

Soweit ich weiß „dieser“ Zeiger ist der Parameter, wie unten in der Funktion von Compiler eingefügt:Wie ist es möglich, "diesen" Zeiger auf Feld zuzuweisen?

class Sample { 
private: 
    int a; 
public: 
    void setA(int a) { 
     this->a = a; 
    } 
}; 

Sample ob; 
ob.setA(5); -> ob.setA(&ob, 5); 

class Sample { 
private: 
    int a; 
public: 
    void setA(Sample* this, int a) { 
     this->a = a; 
    } 
}; 

Btw, fand ich etwas verwirrend Code, den den „diesen“ Zeiger auf const Feld zuweisen. (Hierunter)

class Test { 
    int data; 
public: 
    Test* const test = this; 
    Test(int data = 1) : data(data) { } 
    Test(Test &test) : data(test.data) { } 
}; 
(It has no compile Errors and runs well!) 

Wenn es wahr ist, dass „diese“ Zeiger über Funktion gefördert wird, Wie kann es sein? Ich habe keine Ahnung .. Könnten Sie mir bitte einen Rat geben? Ich bin dankbar für Ihre Antworten.

+4

Welches Problem versuchen Sie zu lösen? –

+1

Das Gleichheitszeichen bedeutet nicht immer Zuweisung. Je nach Kontext kann es viele verschiedene Dinge bedeuten. Im vorliegenden Fall bedeutet es "Initialisierung". –

+0

Hier ist ein weiterer verwirrender Weg, der einer konstanten Variablen einen Wert "zuweist": 'const int a = 5;' –

Antwort

2

Diese Syntax:

Test* const test = this; 

kommt von C++ 11. Es bedeutet "initialisiere test zu this innerhalb irgendein Nichtkopiekonstruktors, der test nicht ausdrücklich bereits initialisiert". Dieser Code wird innerhalb des Konstruktors ausgeführt, und this ist einwandfrei gültig. Der Nutzen einer solchen Initialisierung ist jedoch unklar, und abhängig von der Verwendung von test könnte gefährlich sein.

+0

Das Wort "explizit" scheint dort falsch zu sein: es initialisiert 'test' nicht auf' this' innerhalb einiger Konstruktoren, die 'test' bereits implizit initialisiert haben: Ein vom Compiler generierter Copy-Konstruktor kopiert den Wert von' test'. – hvd

+0

@hvd, ich meine natürlich nicht, Kopierkonstrukteure. Lass es mich klarstellen. – SergeyA

0

Die Eigenschaften der Klasse (Test.test in diesem Fall) werden implizit durch Code initialisiert, der vom Compiler generiert wird. Es gibt eine Funktion, und sie empfängt den Zeiger this, aber es wird alles vom Compiler generiert, weshalb Sie es nicht sehen können.