據我所知,HANDLE只是一個涉及某種「系統資源表」的數字。這個句柄常量是否正確?我想不是因爲它只是用來像數組上的索引那樣訪問表。一個位圖的例子:雖然HBITMAP被聲明爲const,但我可以更改位圖的內容嗎?是一個const HANDLE真的是const嗎?
回答
HANDLE is(AFAIR)int的typedef,因此常量HBITMAP與const int相同。
在這個意義上,你可以改變的位圖的內容,即使處理位圖是常量,因爲常量是指手柄不實際的位圖(認爲它是一個const指針變量的類。)
但是:
- 句柄是在Win32 API,它是一個C API而不是C++(和創建前的C獲得常量)的特點:因爲
你的問題反正沒有實際意義。
- 無論如何您都不能直接更改位圖(或由句柄表示的任何其他「對象」)。該句柄是對Win32結構的不透明引用,並且只能通過用於處理(無雙關語)對象的相應Win32 API調用進行操作。
我把「對象」加上引號,因爲把手指概念對象(概念軟件表示),而不是實際的C++對象,又因爲Win32的是一個C API。
呼籲對「對象」的引用。在處理句柄時,最好將它們視爲具有訪問它們的方法的函數的黑盒子。 – RonaldBarzell
'HANDLE'是一個'void *'(儘管它可能在Window歷史的某個時刻是某種'int')。其他句柄(如HBITMAP)是指向某些結構類型的指針,如果定義了STRICT,如果STRICT沒有被定義,它們只是'HANDLE'的一個typedef。 –
@Michael謝謝,我目前沒有SDK。將typedef設置爲void *是有意義的,因爲int在64位窗口中仍然是32位。 –
- 1. const auto &&真的沒用嗎?
- 2. 'auto const'和'const auto'是否一樣?
- 3. const char * classname :: getname()const?什麼是第一個const關鍵字的含義?
- 4. 它只是const char *的第一個字符是常量嗎?
- 5. const_cast一個右值const const
- 6. 調用一個const函數而不是它的非const版本
- 7. 'char const * const c =「」''的意思是
- 8. C++ const成員函數返回一個const指針..但是返回的指針是什麼類型的const?
- 9. 當const不是一個明確的?
- 10. 「const LPVOID」是否等同於「void * const」?
- 11. 「int * const const * b」是什麼意思?
- 12. const vector <T> *哪部分是const?
- 13. 在C中返回const const成員爲非const:好還是壞?
- 14. 應該從const對象返回const值是否爲const?
- 15. int * const a = int const * b,對於obj(obj * const a = obj const * b)是否爲true?
- 16. const char *不只是一個字符?
- 17. 從const char * +長度構造一個const std :: string便宜嗎?
- 18. const func(const scalar&a)const中的三個「const」,爲什麼?
- 19. 什麼是char * const *?
- 20. const指針指向一個const指針
- 21. 傳遞值時不是「const」冗餘嗎?
- 22. 將const int指派給一個指向int的const指針是非法的?
- 23. const T {};工程,const T;失敗當T是一種非POD,
- 24. static const與extern const不同嗎?
- 25. const char * const和const char []之間有區別嗎?
- 26. 爲什麼「const int * p是一個const int指針」是一個錯誤的解釋,但廣泛使用?
- 27. 哪一個是正確的:vector <const string> OR const vector <string>?
- 28. 鑄造const void * const const *
- 29. 轉const const wchar_t *爲const char *
- 30. 將const傳遞給接受const指針的函數不是const正確的?
API函數是否使用'const HBITMAP'或者只是一個'HBITMAP'?這應該回答你的問題。如果是後者,那麼不要費神地將其聲明爲'const'(無論如何,你最終只會拋棄const)。另外,'HANDLE'可能不僅僅是一個數字,它可能是一個不透明的類型指針,它直接指向一些已分配的資源,而沒有任何表之間的轉換。最好不要對這種不透明類型做出假設。 – Praetorian
一個HANDLE總是指同一個操作系統對象。其狀態可能肯定會發生變化,如位圖或互斥體。所以它是一個'foo const *',而不是'const foo *'。 –