2016-04-14 39 views
-2

據我所知,「this」指針是像下面插入函數由編譯器的參數:如何將「this」指針指定給字段?

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; 
    } 
}; 

順便說一句,我發現了一些令人困惑的代碼,分配「this」指針爲const領域。 (請參閱下面的內容)

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!) 

如果「this」指針是通過函數傳遞的,那該怎麼做? 我不知道.. 你能給我一些建議嗎?我很感激你的回覆。

+4

你想解決什麼問題? –

+1

等號並不總是意味着分配。這可能意味着許多不同的事情,取決於上下文。在目前的情況下,它意味着「初始化」。 –

+0

下面是另一個令人困惑的方式,它爲一個常量賦值「const int a = 5;' –

回答

2

此語法:

Test* const test = this; 

來源於C++ 11。這意味着「初始化testthis裏面的任何非複製構造函數,它尚未明確初始化test」。

因此,此代碼在構造函數內部執行,並且this是完全有效的。但是,做這種初始化的好處還不清楚,並且依賴於test的使用可能是危險的。

+0

「顯式」這個詞在這裏似乎有錯誤:它並沒有在已經初始化了'test'的構造函數中隱式地將'test'初始化爲'this':編譯器生成的拷貝構造函數會高興地複製'test'的值。 – hvd

+0

@ hvd,我當然不是指複製構造函數。讓我說清楚。 – SergeyA

0

該類的屬性(本例中爲Test.test)由編譯器生成的代碼隱式初始化。有一個函數,它確實收到了this指針,但它都是由編譯器生成的,這就是爲什麼你看不到它。