亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++基礎之this指針與另一種“多態”

2020-01-26 15:57:39
字體:
來源:轉載
供稿:網友

一、引入
定義一個類的對象,首先系統已經給這個對象分配了空間,然后會調用構造函數。

一個類有多個對象,當程序中調用對象的某個函數時,有可能要訪問到這個對象的成員變量。
而對于同一個類的每一個對象,都是共享同一份類函數。對象有單獨的變量,但是沒有單獨的函數,所以當調用函數時,系統必須讓函數知道這是哪個對象的操作,從而確定成員變量是哪個對象的。
這種用于對成員變量歸屬對像進行區分的東西,就叫做this指針。事實上它就是對象的地址,這一點從反匯編出來的代碼可以看到。

二、分析
1、測試代碼:

復制代碼 代碼如下:

/////////////////////////////////////////////////////////////////////////////////////
#include<iostream>
using   namespace   std;
/////////////////////////////////////////////////////
class A
{
public:
    A(char *szname)
    {
        cout<<"construct"<<endl;
        name
 = new char[20];
        strcpy(name,
 szname);
    }
    ~A()
    {
        cout<<"destruct"<<endl;
        delete name;
    }
    void    show();
private:
    char    *name;
};
/////////////////////////////////////////////////////
void    A::show()
{
    cout<<"name
 = "<<name<<endl;
}
/////////////////////////////////////////////////////
int main()
{
    A
 a("zhangsan");
    a.show();
    system("pause");
    return 0;
}

程序在VC++6.0 32位操作系統上編譯、運行。
對編譯后的EXE文件,進行反匯編。反匯編工具為OllyDbg。

2、反匯編分析
關鍵點截圖如下:
(1)從圖1可以發現this指針通過ECX寄存器,傳遞給了成員函數。this指針就是對象的地址。

圖 1 Main函數

(2)從圖 2可以發現訪問對象的成員變量用的就是之前通過ECX傳入的this指針。

 

圖 2 show()函數

三、深入理解

通過截圖及相關的資料,可以很清晰的知道在調用構造函數、show()函數之前的那個ECX就是this指針,也就是說這是一個驗證性的實驗,答案已經很清楚了,所要做的就是去動手體驗一下。但是,假如我不懂C++、我不懂什么this指針,我一樣可以發現這個叫做“this指針”的東西。通過OD的動態調試,當顯示出了name時,逐步回溯可以發現name的源頭是ECX。OD重新載入,查看在進入show()函數之前ECX是哪里來的,最終可以一步步的發現,ECX就是一個地址,這個地址里邊的第一個值也是一個地址,指向一串字符串。再往上分析,進入show()上邊的構造函數,可以發現里邊有new操作,strcpy操作,這里就發現了字符串空間、內容的來源。至此,基本就分析完了。

通過這個過程可以發現很多C++的知識。如:對象的空間是在調用構造函數之前就分配好了的;對象里邊沒有函數;this指針通過寄存器ECX傳遞;通過聲明定義的對象它的空間分配在棧中;等等這些跟系統或者C++有關聯的知識。

但是,對于一個不懂C++的人看來,上面一段的體會都是沒有的。從匯編指令看不出C++的思想,this指針不過是一個地址;對象不過是一些空間;構造函數、析構函數以及其它的函數,也不過是一堆指令的集合。

C++的同一個類定義出來的多個對象,從匯編指令看來是這樣的:有很多塊地址空間,它們有相同的大小。當不同的對象調用成員函數時,在匯編指令看來是:它們都call同一個地址,這個call指令其實里邊是一個jmp指令,用于跳向某個位置,在call指令之前一般都會把一個地址放到ECX中,當然有時候會用堆?;蛘咂渌拇嫫?。

C++的繼承、多態、封裝,對匯編程序員來說是看不出有什么神奇的,對于C++程序員來說那可就不同了,可以省去很多的工作,把很多事情都交給了編譯器,讓編譯器自動給你搞定。

C++程序員所討論的對象及其眾多的特點、優點,最終還是變成了“低級”的指令,而且可能是效率低下的指令,即便如此,它的優點仍遠大于缺點,它讓編程變得容易、高效。

四、延伸

忽然想到了C++的多態,一句話“將子類類型的指針賦值給父類類型的指針”,多態是通過虛函數實現。對虛函數及其相關內容的原理、詳細理解就不細說了。

說下我的簡單理解,有一個基類A和子類B、C,有一個函數以基類A的指針為參數,然后在函數里頭通過指針調用基類的成員函數。假如這個被調用的基類成員函數不是虛函數,那么是不可能實現多態的,因為翻譯成匯編指令的時候,調用成員函數的這個地方是一個call指令,然后這個call指令跳到某個地方去執行,這是一個固定了的地址。通過定義為虛函數,調用成員函數的這個地方是通過虛函數表指針來確定調用哪個函數的,而虛函數表指針就放在對象的地址空間中,如果對象變了,那么虛函數表指針也變了,調用的函數也就不同了。對于那個以基類A的指針為參數的函數,指針即是對象的地址,如果傳遞的地址是子類B或者C的對象的地址,那么虛函數表指針也就不同了,調用的成員函數也就不同了。

這就是多態,這種多態使得調用同一個函數,因為傳遞參數的不同而顯示出差異,參數可以是基類對象或者眾多不同的子類對象。它們的差異是類與類之間的。

有虛函數的對象的內存布局,比沒有虛函數的對象多了一個指向虛函數表的指針。因為虛函數的調用是通過虛函數表指針來實現的,所以有了多態。

再考慮一下C++的this指針,一個類中的成員函數,依據this指針來區分不同的對象,也就是說根據this指針實現了訪問不同的對象的成員變量。

這是否也是多態的一種表現?這里所說的多態已經不是那個“父類指針指向子類對象”的教條了,而是體現在同一個類的不同對象之間,調用同一個成員函數,依據參數“this指針”來實現訪問不同的對象的成員變量。成員函數訪問成員變量,在編譯期無法確定它訪問的成員變量在哪一個地址的,只有到了運行期依據this指針才能確定訪問的地址。這一點很類似于類的多態:以基類指針為參數的函數里調用了某個基類的虛成員函數,在編譯期無法確定程序運行時調用的會是哪個類的對象,只有到了運行期才確定會調用哪個類的對象。

this指針識別了同一個類的不同的對象,換句話說,this指針使得成員函數可以訪問同一個類的不同對象。再深入一點,this指針使得成員函數會因為this指針的不同而訪問到了不同的成員變量。這也是多態吧,只是它是必然存在的多態,這種多態跟基類與派生類之間的多態是不同級別的多態,它不像一般的多態可以通過對使用虛函數的選擇來取舍,它是一個類對應多個對象、多個對象共享一份成員函數代碼帶來的必然結果。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产综合久久香蕉最新版| 精品呦交小u女在线| 亚洲欧美国产制服动漫| 中文字幕一区二区三区电影| 国产女精品视频网站免费| 国产精品免费小视频| 8050国产精品久久久久久| 国产欧美一区二区三区在线| 久久久国产精品一区| 亚洲国产精品va在线观看黑人| 一级做a爰片久久毛片美女图片| 日韩av免费在线观看| 亚洲最大激情中文字幕| 日韩精品福利网站| 亚洲天堂免费观看| 国产主播喷水一区二区| 精品国产91久久久久久| 成人黄色免费网站在线观看| 欧美日韩亚洲91| 亚洲精品网址在线观看| 欧美精品激情blacked18| 日本在线精品视频| 亚洲午夜性刺激影院| 成人免费视频xnxx.com| 成人两性免费视频| 欧美性猛交xxxx免费看漫画| 欧美日韩在线视频一区| 九九精品视频在线观看| 在线成人激情视频| 欧美成在线观看| 欧美亚洲国产视频| 亚洲一二三在线| 色视频www在线播放国产成人| 欧美专区中文字幕| 亚洲成人黄色网| 国产精品h片在线播放| 久久久久久久久中文字幕| 永久免费看mv网站入口亚洲| 亚洲第一区第一页| 亚洲男人天堂久| 亚洲精品电影网在线观看| 久久成人亚洲精品| 国产精品视频公开费视频| 亚洲国产欧美一区二区三区同亚洲| 波霸ol色综合久久| 欧美人与性动交a欧美精品| 国产香蕉97碰碰久久人人| 久久精品国产69国产精品亚洲| 久久亚洲精品视频| 国产成人拍精品视频午夜网站| 欧美中文在线观看| 亚洲乱码一区av黑人高潮| 久久亚洲国产精品| 日韩av免费在线播放| 97碰碰碰免费色视频| 姬川优奈aav一区二区| 都市激情亚洲色图| 亚洲精品视频久久| 国产精品久久久久久久av大片| 日本高清+成人网在线观看| 国产欧美在线视频| 国产精品免费视频久久久| 伊人精品在线观看| 国产一区av在线| 欧美黑人xxxⅹ高潮交| 国产精彩精品视频| 日韩精品免费电影| 国产亚洲人成a一在线v站| 欧美成人激情在线| 亚洲激情视频在线| 久久久久久国产精品三级玉女聊斋| 在线视频欧美日韩| 成人免费网视频| 欧美色图在线视频| 亚洲视频自拍偷拍| www.久久草.com| 日韩大片免费观看视频播放| 一本色道久久88综合亚洲精品ⅰ| 国产日韩精品在线| 国产成人精品久久| 亚洲欧美在线看| 欧美精品福利视频| 精品人伦一区二区三区蜜桃免费| 亚洲激情久久久| 亚洲成人av在线| 91在线观看免费高清完整版在线观看| 国内精品模特av私拍在线观看| 欧美肥臀大乳一区二区免费视频| 亚洲成人精品av| 午夜精品三级视频福利| 欧美色欧美亚洲高清在线视频| 免费91麻豆精品国产自产在线观看| 26uuu亚洲国产精品| 亚洲成人精品av| 欧美壮男野外gaytube| 欧美高清性猛交| 久久精品国产成人精品| 91社影院在线观看| 在线免费看av不卡| 欧美高清视频在线观看| 欧美麻豆久久久久久中文| 91伊人影院在线播放| 亚洲深夜福利视频| 亚洲97在线观看| 久久99视频免费| 中文字幕日韩av综合精品| 精品视频久久久| 日韩精品在线电影| 欧美最猛性xxxx| 亚洲欧美国产日韩中文字幕| 国产一区二区美女视频| 91沈先生在线观看| 国产精品久久久久aaaa九色| 久久综合电影一区| 欧美黑人巨大xxx极品| 成人免费淫片aa视频免费| 韩国三级电影久久久久久| 夜夜嗨av色一区二区不卡| 国产福利精品在线| 亚洲国产精品中文| 精品国产成人在线| 欧美激情在线一区| 欧美丰满片xxx777| 国内揄拍国内精品少妇国语| 久久成人人人人精品欧| 国产成人精品视频在线观看| 国产精品福利在线观看网址| 亚洲国产精品中文| 亚洲影院高清在线| 日本韩国在线不卡| 亚洲最大福利视频网| 亚洲天堂色网站| 欧美精品在线播放| 国产精品美女主播| 日本不卡高字幕在线2019| 亚洲人成毛片在线播放| 亚洲视屏在线播放| 隔壁老王国产在线精品| 亚洲国产精品va在线| 国内精品中文字幕| 77777少妇光屁股久久一区| 久久色免费在线视频| 欧美性xxxxx极品| 黑人精品xxx一区一二区| 亚洲视频999| 狠狠躁夜夜躁久久躁别揉| 97成人在线视频| 中文日韩在线观看| 欧美孕妇与黑人孕交| 国产精品影片在线观看| 91热福利电影| 亚洲天堂日韩电影| 国产精品久久久久国产a级| 热门国产精品亚洲第一区在线| 91影视免费在线观看| 欧美成人激情图片网| 热re91久久精品国99热蜜臀| 国产精品久久久久一区二区| 久久久精品免费| 永久免费精品影视网站| 国产第一区电影| 国产成人精品午夜| 国产性猛交xxxx免费看久久| 亚洲精品自拍偷拍|