亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++的函數指針用法

發布時間:2021-07-12 10:44:28 來源:億速云 閱讀:138 作者:chen 欄目:大數據

這篇文章主要講解了“C++的函數指針用法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++的函數指針用法”吧!

看C++代碼時看到了一段很新奇的用法, 回來剖析了一下, 感覺雖然原理很簡單還是值得記錄一下的。

代碼大概是這個樣子的:

class test {
public:
       void a1(){printf("test::a1\n");};
}

int main()
{
       test *t = new test();
       void (test::*a)(void);
       a = &test::a1;
       (t->*a)();
}

以前在C++中用函數指針時,從來都反射性的去用靜態成員函數, 卻從來都沒想到原來普通的成員函數也是可以使用函數指針的。

仔細分析一下, 原理也早就知道。 無非就是this指針的事。

使用test對象的指針去調用某函數與普通的C函數指針惟一的區別就是, 會將test對象的指針作為this指針通過ecx寄存器來傳入, 那么所有的C++類成員函數在本質上也是通過ecx的值來訪問他們的成員變量。


在不反匯編的情況下, 為了更清晰的驗證一下上述結論, 加入了如下代碼:

void (*b)(void);
b = (void (*)(void))&test::a1;
b();

最后可以發現函數依然可以運行。

當然這里其實有點取巧,因為test::a1函數并沒有訪問類的成員變量, 所以我們可以將此成員函數直接作為普通的函數來調用。


如果test::a1函數訪問成員變量的話, 由于C函數調用時并沒有傳入this指針, 那么test::a1函數必將會由于隨機的ecx值而導致崩潰。

但是這段代碼已經足夠證明,&test::a1給出的是函數的絕對地址與普通的C函數的地址并無兩樣,那么調用b()和(t->*a)()的區別其實就在于是否傳入了this指針。

如果再有點hack精神, 其實可以去將test::a1函數更改為訪問成員變量, 然后在調用C函數前, 可以手動內嵌asm代碼來將ecx值強制改為t的指針值, 如果效果一樣, 那么即可完全證明上述結論。

感謝各位的閱讀,以上就是“C++的函數指針用法”的內容了,經過本文的學習后,相信大家對C++的函數指針用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

滦平县| 德惠市| 伊宁市| 甘谷县| 武胜县| 嘉定区| 班玛县| 象州县| 屯昌县| 石嘴山市| 柯坪县| 汕头市| 滦平县| 水城县| 滦南县| 信阳市| 小金县| 沙雅县| 玉树县| 望都县| 宣城市| 启东市| 晋中市| 封丘县| 莱西市| 土默特右旗| 桑日县| 阜平县| 综艺| 敦煌市| 永兴县| 盐城市| 娄烦县| 嘉义县| 临高县| 台山市| 夏津县| 林甸县| 墨脱县| 旌德县| 金沙县|