為什么類中的線程函數必須要聲明靜態?


之前也沒注意到這問題,大家先搞清楚下面幾個關鍵詞吧:
[cpp]  view plain copy
  1. class CMyTest  
  2. {  
  3. public:  
  4.     CMyTest();  
  5.     ~CMyTest();  
  6.   
  7.     DWORD   Start();  
  8.     static DWORD WINAPI ThreadFun(LPVOID);  
  9.   
  10.     // ....  
  11. };  
  12.   
  13. void main()  
  14. {  
  15.     CMyTest test;  
  16.     // .....  
  17. }  

其中CMyTest是一個類,main函數中test是這個類的一個局部變量(對象)。

看完上面這個例子,再仔細推敲一下下面這段話:

類的靜態函數不屬於該類的任何一個對象,而是屬於類本身,所以不受對象局部變量的影響,在運行時可以直接調用類的靜態函數,從而啟動線程!

相反,如果一個類的一個局部對象的生命周期結束了,難道線程函數就不能用了嗎?


其實類的靜態函數就跟全局函數是一個樣子的, 只是調用的時候要加下個類修飾符而以.
至於為什么不能是非靜態成員函數呢, 因為非靜態成員函數都會在參數列表中加上一個this指針為為參數, 這樣的話你寫的線程函數就不符合調用規定了.
比如 DWORD WINAPI ThreadFun(LPVOID); 是非靜態的,實際編譯后,就會變成
DWORD WINAPI ThreadFun(LPVOID, CMyClass *this); 
這個函數就明顯不能作為線程的函數了, 因為多了個參數.所以編譯就過不了了.


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com