此用一個小示例來說明c++中成員函數是怎麼調用的
#includeusing namespace std; class Test{ public: void funcMember(){ cout << "I'm member function" << endl; int *ptr = reinterpret_cast (const_cast (this)); //int *ptr = (int*)(const_cast (this)); cout << *ptr << endl; //沒弄清為什麼在int x; int y;再棧中的部局中間竟有8個字節的cc cc cc cc cc cc cc cc本應x,y緊挨著的 ptr += 3; //所以就因為多了兩個4字節就加了3 cout << *ptr << endl; ptr += 3; cout << *ptr << endl; ptr += 3; cout << *ptr << endl; ptr += 3; cout << *ptr << endl; } Test():x(3){} int x; }; int main(){ Test *t = NULL, *ptr; int x = 10; int y = 20; int z = 30; int zz = 40; Test tt; // t->funcMember(); ptr = &tt; ptr->funcMember(); cout << "--------------------------" << endl; tt.funcMember(); return 0; }
先來說明一下,被注釋掉的部分,為什麼t是空指針,這樣的調用還成功呢
請看下圖反匯編後的結果
因此第一處畫紅線的部分,圖中漏掉了一
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+xMfU2b+0sbvXosrNtfS687PM0PK1xNTL0NC94bn7yOe6zsTYo788L3A+CjxwPjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20140509/20140509091953256.jpg" alt="">
從結果中可以看出,對象的實例是作為地址傳入函數中的,因此只要不使用此地址,無論它是否為空都不會錯誤,如果使用了向本示例所做的那樣,
知道原因也可以靈活改變。