91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

C++類包含函數有哪些

發布時間:2021-11-29 15:54:02 來源:億速云 閱讀:140 作者:iii 欄目:編程語言

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

C++類包含三個我們關心的函數:構造函數,析構函數,和所有重要的 DoSomething 函數,我們需要把每一個函數包裹成與其等價的C++函數,在這里拿出來和大家分享一下。

// original class  class CFoo  {  public:   CFoo(int x);   ~CFoo();   int DoSomething(int y);  };  // flattened C code  void* __stdcall new_CFoo(int x)  {   return new CFoo(x);  }  int __stdcall CFoo_DoSomething(void* handle, int y)  {   CFoo *foo = reinterpret_cast<CFoo *>(handle);   return foo->DoSomething(y);  }  void __stdcall delete_CFoo(void *handle)  {   CFoo *foo = reinterpret_cast<CFoo *>(handle);   delete foo;  }

這里有幾個比較重要的地方要注意。首先,注意每一個C++類被映射為一個簡單的 C 函數。其次,觀察到我們為 C 函數明確地使用 __stdcall 調用習慣。在前一篇 DLL 文章里,我們知道簡單的調用在 MSVC DLL 里的無格式 C 函數,真是很麻煩。

如果我們放棄越過種種艱難困苦去用它,我們可以使這個努力稍微容易一點。讓 Borland 調用 Microsoft DLL 最簡單的辦法是 DLL 導出無格式,無修飾,__stdcall 調用習慣的 C++函數。Borland 和 Microsoft 對 __cdecl 函數的處理上是不同的。

通常,他們對 __stdcall 函數也不同,因為 MSVC 修飾 __stdcall 函數,但我們可以通過添加一個 DEF 文件到 MSVC 工程里來阻止這種行為。參見下載部分的例子有 DEF 文件的例子。其它關于代碼要注意的事情是 new_CFoo 函數返回一個指向 CFoo 對象的指針。BCB 調用者必須在本地保存這個指針。這可能看起來和這篇文章的主題有點矛盾。

畢竟,我想 BCB 不能使用來自 MSVC DLL 的 C++類?如果那是正確的,那么為什么我們還要返回一個 CFoo 對象指針呢?答案是 BCB 不能調用 MSVC DLL 導出類的成員函數。但是,這并不意味著它不能存儲這樣對象的地址。new_CFoo 返回的是一個 CFoo 對象的指針。

BCB 客戶端可以存儲這個指針,但不能用。BCB 不能廢棄它(不應當嘗試這么做)。讓這個觀點更容易理解一點,new_CFoo 返回一個空指針(總之它不能返回別的什么東西)。在 BCB 這邊,除了存儲它,然后把它傳回給 DLL,沒有什么可以安全地處理這個空指針的方法。

Ok,在我們繼續前進之前,還有另外兩個要十分注意的地方。首先,注意 CFoo_DoSomething 把空指針作為它的***個參數這個空指針與 new_CFoo 返回的是同一個空指針。空指針用 reinterpret_cast 被追溯到 CFoo 對象(你知道,當你看到一個 reinterpret_cast 的時候。

你正在處理是難看的代碼)。DoSomething 成員函數在轉換之后被調用。***注意空指針也是C++的參數。包裝 DLL 刪除對象是至關緊要的。你不應當在 BCB 里對空指針調用 delete。顯然它不會按你想的去做。

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

向AI問一下細節

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

c++
AI

班玛县| 西平县| 汝阳县| 黑山县| 利川市| 开原市| 蒙自县| 宁陵县| 泽州县| 娄烦县| 琼结县| 桃源县| 通榆县| 抚远县| 莱州市| 山东省| 镇沅| 英山县| 胶南市| 临沧市| 南城县| 文登市| 石泉县| 沧州市| 宁明县| 工布江达县| 昌平区| 陆良县| 营山县| 志丹县| 杭锦旗| 太仆寺旗| 万载县| 广丰县| 临高县| 高尔夫| 吴江市| 苏尼特左旗| 乐陵市| 沛县| 麦盖提县|