2011-04-13 26 views
1

假設我有一個類:「this」指針如何碰巧指向不同的對象?

class test { 
public: 
    void print(); 
private: 
    int x; 
}; 

void test::print() 
{ 
    cout<< this->x; 
} 

和我有這些變量定義:

test object1; 
test object2; 

當我打電話object1.print()this發生的object1存儲地址,所以我得到xobject1印刷時我打電話object2.print()this碰巧存儲地址object2和我得到xobject2打印。它是如何發生的?

+0

你能澄清你的意思嗎? – 2011-04-13 11:03:47

+0

這是神奇的 - ) – blaze 2011-04-13 11:36:51

回答

6

,每一個非靜態成員函數有一個隱隱藏「當前對象」暴露給您this指針參數。

所以,你可以認爲,對於

test::print(); 

有一些

test_print(test* this); 

全局函數,所以當你在你的代碼編寫

objectX.print(); 

編譯器插入到

通話
test_print(&objectX); 

這樣,成員函數就知道「當前」對象的地址。

+0

注意:例如,在Python中,這是隱式傳遞的,但在函數簽名中明確聲明('def func(self,i)',其中'self'代表對象的一個​​實例) – 2011-04-13 11:58:00

1

想想看,this只是一個指向內存的指針,無論你正在使用什麼對象。所以如果你做obj1.print(),那麼this = &obj1;。如果你做obj2.print(),那麼this = &obj2;

1

類測試的每個實例得到它的成員變量x的自己的副本不同的值。由於x對於每個實例都是唯一的,因此該值可以是任何您希望的值。 變量this,指它與之關聯的實例。你不必使用變量'this'。你可以這樣寫:

void test::print() 
{ 
    cout << x; 
} 
2

你可以認爲this指針是函數的一個隱含參數。想象一下,有點類似

class C { 
public: 
    C(int x) : m_x(x) { } 

    void increment(int value) { 
    m_x += value; // same as 'this->m_x += value' 
    } 

    int multiply(int times) const { 
    return m_x * times; // same as 'return this->m_x * times;' 
    } 

private: 
    int m_x; 
}; 

,它允許你寫代碼像

C two(2); 
two.increment(2); 
int result = two.multiply(3); 

現在所發生的情況是,成員函數incrementmultiply被稱爲一個額外的指針參數,指向在其上調用函數的對象。該指針在方法內部被稱爲thisthis指針的類型不同,具體取決於方法是否爲const(因爲multiply是)或不是(與increment一樣)。

你可以不喜歡自己動手爲好,考慮:

class C { 
public: 
    C(int x) : m_x(x) { } 

    void increment(C * const that, int value) { 
    that->m_x += value; 
    } 

    int multiply(C const * const that, int times) const { 
    return that->m_x * times; 
    } 

private: 
    int m_x; 
}; 

,您可以編寫代碼就像

C two(2); 
two.increment(&two, 2); 
int result = two.multiply(&two, 3); 

注意,this指針的類型是C const * constmultiply功能,所以指針本身都是const,而且指向的對象也是!這就是爲什麼你不能在const方法內改變成員變量 - this指針有一個禁止它的類型。這可以使用mutable關鍵字來解決(我不想讓扯到太遠,所以我寧願不解釋是如何工作的),但即使使用const_cast

int C::multiply(int times) const { 
    C * const that = const_cast<C * const>(this); 
    that->m_x = 0; // evil! Can modify member variable because const'ness was casted away 
    // .. 
} 

我提這是因爲它證明this不是特別的指針,因爲它可能看起來像這樣,並且這種特殊的破解通常比製作成員變量更好的解決方案mutable,因爲這個破解對於一個函數是局部的,而mutable使得變量對於全部可變const該類的方法。

+0

+1因爲這個'const正確性 – 2011-09-29 10:11:45

相關問題