先問一個問題,在C++裡,成員函數裡的this指針和調用此函數的對象地址總是一樣的嗎?如果你的回答是:不一定。那麼至少你是個老手吧,下面的內容你就不用看了;如果你的回答是:是啊,那麼強烈建議你看看下面的內容。
非靜態成員函數,無論是不是虛函數,都隱藏了一個this指針參數。這個參數的目的就是給函數提供一個基地址,以便於函數體內能找到對象的成員變量。那非靜態成員函數是如何根據this指針找到成員變量的呢?
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
C++11 獲取系統時間庫函數 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htm
C++11中正則表達式測試 http://www.linuxidc.com/Linux/2012-08/69086.htm
直接看例子吧
1沒有虛表的情況
#include <iostream>
#include <stdio.h>
using namespace std;
class A
{
public:
int x;
int y;
public:
void F1()
{
this->x = 1;
this->y = 2;
cout<<"this指針得值是:"<<std::hex<<std::showbase<<this<<endl;
}
};
int main(int argc, char** argv)
{
A a;
cout<<"a對象的地址是:"<<&a<<endl;
cout<<"a對象的大小是:"<<sizeof(A)<<endl;
cout<<"成員a.x的地址是: "<<&a.x<<endl;
cout<<"成員a.x的偏移是:"<<&A::x<<endl;
a.F1();
cin>>argc;
return 0;
}
那麼函數F1的實現偽代碼為:
*(this+&A::x-1) = 1;
*(this+&A::y-1) = 2;
其中&A::x是成員x的偏移+1,&A::y是成員y的偏移+1,這可是C++基本語法的知識,希望你知道,呵呵。可這些偏移量是相對應那裡的偏移呢,是對象地址嗎,答案是NO。是相對於第一個成員變量的偏移,這對於有些對象也許沒有差別,但是對於有虛表的類的對象,就有差別了。這些偏移在編譯期間就是確定了的。對於本例在VC++2010下&A::x,值為1, &A::y,值為5。為什麼不是0,4,請看《Inside The C++ Object Model》。
所以,對於找到成員變量,需要進一步確定的只有this的值。程序運行結果如下:
可見此例中,對象的地址與this指針的地址相同,內存圖如下所示。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/101577p2.htm