你可以認爲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);
現在所發生的情況是,成員函數increment
和multiply
被稱爲一個額外的指針參數,指向在其上調用函數的對象。該指針在方法內部被稱爲this
。 this
指針的類型不同,具體取決於方法是否爲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 * const
爲multiply
功能,所以指針本身都是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
該類的方法。
你能澄清你的意思嗎? – 2011-04-13 11:03:47
這是神奇的 - ) – blaze 2011-04-13 11:36:51