VC6中,為什么只有類中的static成員函數(shù),才可
系統(tǒng)
2264 0
VC6中,為什么只有類中的static成員函數(shù),才可以做為線程啟動(dòng)函數(shù)(ThreadProc)?
|
類中的static成員函數(shù),存放在堆區(qū)吧?
類中的非靜態(tài)成員函數(shù),也存放在堆區(qū)吧?
如果是,那么為什么會出現(xiàn)如題的現(xiàn)象呢?
|
|
|
回復(fù)內(nèi)容
|
【an_bachelor】:
個(gè)人以為應(yīng)該都放在代碼段
【haoranisme】:
堆區(qū)就存在代碼段吧?
那么,為什么只有類中的static成員函數(shù),才可以做為線程啟動(dòng)函數(shù)(ThreadProc)呢?
【laolaoliu2002】:
static是c++中很常用的修飾符,它被用來控制變量的存儲方式和可見性,下面我將從static修飾符的產(chǎn)生原因、作用談起,全面分析static修飾符的實(shí)質(zhì)。
static的兩大作用:
一、控制存儲方式:
static被引入以告知編譯器,將變量存儲在程序的靜態(tài)存儲區(qū)而非棧上空間。
1、引出原因:函數(shù)內(nèi)部定義的變量,在程序執(zhí)行到它的定義處時(shí),編譯器為它在棧上分配空間,大家知道,函數(shù)在棧上分配的空間在此函數(shù)執(zhí)行結(jié)束時(shí)會釋放掉,這樣就產(chǎn)生了一個(gè)問題:如果想將函數(shù)中此變量的值保存至下一次調(diào)用時(shí),如何實(shí)現(xiàn)?
最容易想到的方法是定義一個(gè)全局的變量,但定義為一個(gè)全局變量有許多缺點(diǎn),最明顯的缺點(diǎn)是破壞了此變量的訪問范圍(使得在此函數(shù)中定義的變量,不僅僅受此函數(shù)控制)。
2、解決方案:因此c++中引入了static,用它來修飾變量,它能夠指示編譯器將此變量在程序的靜態(tài)存儲區(qū)分配空間保存,這樣即實(shí)現(xiàn)了目的,又使得此變量的存取范圍不變。
二、控制可見性與連接類型:
static還有一個(gè)作用,它會把變量的可見范圍限制在編譯單元中,使它成為一個(gè)內(nèi)部連接,這時(shí),它的反義詞為”extern”.
static作用分析總結(jié):static總是使得變量或?qū)ο蟮拇鎯π问阶兂伸o態(tài)存儲,連接方式變成內(nèi)部連接,對于局部變量(已經(jīng)是內(nèi)部連接了),它僅改變其存儲方式;對于全局變量(已經(jīng)是靜態(tài)存儲了),它僅改變其連接類型。
類中的static成員:
一、出現(xiàn)原因及作用:
1、需要在一個(gè)類的各個(gè)對象間交互,即需要一個(gè)數(shù)據(jù)對象為整個(gè)類而非某個(gè)對象服務(wù)。
2、同時(shí)又力求不破壞類的封裝性,即要求此成員隱藏在類的內(nèi)部,對外不可見。
類的static成員滿足了上述的要求,因?yàn)樗哂腥缦绿卣鳎河歇?dú)立的存儲區(qū),屬于整個(gè)類。
二、注意:
1、對于靜態(tài)的數(shù)據(jù)成員,連接器會保證它擁有一個(gè)單一的外部定義。靜態(tài)數(shù)據(jù)成員按定義出現(xiàn)的先后順序依次初始化,注意靜態(tài)成員嵌套時(shí),要保證所嵌套的成員已經(jīng)初始化了。消除時(shí)的順序是初始化的反順序。
2、類的靜態(tài)成員函數(shù)是屬于整個(gè)類而非類的對象,所以它沒有this指針,這就導(dǎo)致了它僅能訪問類的靜態(tài)數(shù)據(jù)和靜態(tài)成員函數(shù)。
【laolaoliu2002】:
將成員函數(shù)聲明為靜態(tài)雖然可以解決作為線程函數(shù)的問題,但是它帶來了新的問題,那就是static成員函數(shù)只能訪問static成員。解決此問題的一種途徑是可以在調(diào)用類靜態(tài)成員函數(shù)(線程函數(shù))時(shí)將this指針作為參數(shù)傳入,并在改線程函數(shù)中用強(qiáng)制類型轉(zhuǎn)換將this轉(zhuǎn)換成指向該類的指針,通過該指針訪問非靜態(tài)成員。
【haoranisme】:
學(xué)習(xí)了,但還是想知道:
為什么只有類中的static成員函數(shù),才可以做為線程啟動(dòng)函數(shù)(ThreadProc),
而類的非靜態(tài)成員函數(shù)不可以?
【gaooo】:
成員函數(shù)調(diào)用需this
【gaooo】:
非成員函數(shù)不需要this指針
【haoranisme】:
突然想到,會不會是為了區(qū)分代碼段和數(shù)據(jù)段呢?
【robinwjb】:
線程函數(shù)是獨(dú)立于類的實(shí)例而存在的,他的生命期不是類的生命期,而是整個(gè)process。
試想一下,如果可以用非靜態(tài)成員函數(shù)作為線程函數(shù),如果沒有定義一個(gè)這個(gè)類的實(shí)例,
豈不是無法調(diào)用線程函數(shù)了?
【haoranisme】:
試想一下,如果可以用非靜態(tài)成員函數(shù)作為線程函數(shù),如果沒有定義一個(gè)這個(gè)類的實(shí)例,
豈不是無法調(diào)用線程函數(shù)了?
++++++++++++++++++++++++++++++++++++++++++++++++++++
不明白呀!
【LiChenYue】:
學(xué)習(xí)!關(guān)注!
【robinwjb】:
試想一下,如果可以用非靜態(tài)成員函數(shù)作為線程函數(shù),如果沒有定義一個(gè)這個(gè)類的實(shí)例,
豈不是無法調(diào)用線程函數(shù)了?
++++++++++++++++++++++++++++++++++++++++++++++++++++
不明白呀!
------------------------------------------------------------
靜態(tài)成員(無論是函數(shù)還是變量)是存儲在全局變量區(qū)的,也就是在整個(gè)程序生命中有效的。
而非靜態(tài)成員是隨類的實(shí)例生成而生,隨著類的實(shí)例死亡而死的。
所以,如果非靜態(tài)成員函數(shù)作為線程函數(shù)的話,此時(shí)這個(gè)類的實(shí)例不存在,而程序要生成線程了,卻發(fā)現(xiàn)線程函數(shù)根本不存在。
【haoranisme】:
非靜態(tài)成員函數(shù),也存儲全局變量區(qū)(堆區(qū))吧?
【chehw】:
設(shè)某函數(shù)原型為LRESULTThreadProc(LPVOIDpv);
若為非靜態(tài)成員函數(shù),編譯時(shí)自動(dòng)展開為ThreadProc(pClass->this,pv);與線程函數(shù)調(diào)用不相符。所以必須使用全局函數(shù)或類靜態(tài)成員函數(shù)
【haoranisme】:
會不會是為了區(qū)分代碼段和數(shù)據(jù)段呢?
【robinwjb】:
非靜態(tài)成員函數(shù),也存儲全局變量區(qū)(堆區(qū))吧?
------------------------------------------------
如果沒有類的實(shí)例,則非靜態(tài)成員函數(shù)沒有存儲空間。
只是作為代碼存在代碼區(qū)
【wltg2001】:
成員函數(shù)都有一個(gè)隱含參數(shù)this,也就是指向這個(gè)對象實(shí)例的指針,所以不能做啟動(dòng)函數(shù)
【wltg2001】:
用成員函數(shù)作線程啟動(dòng)函數(shù)編譯應(yīng)該都不會過,就是因?yàn)閰?shù)不匹配的原因
【haoranisme】:
感覺不象
【kouzhongling】:
設(shè)某函數(shù)原型為LRESULTThreadProc(LPVOIDpv);
若為非靜態(tài)成員函數(shù),編譯時(shí)自動(dòng)展開為ThreadProc(pClass->this,pv);與線程函數(shù)調(diào)用不相符。所以必須使用全局函數(shù)或類靜態(tài)成員函數(shù)
---------------------------------------------
同意
作為線程入口當(dāng)然不應(yīng)該與類對象共存亡應(yīng)該具有全局性
俺認(rèn)為所有方法均在于代碼段至于堆中是否存有可執(zhí)行代碼我也想知道
我一直認(rèn)為堆只是存放數(shù)據(jù)的地方
【haoranisme】:
謝謝各位了!
【Nowish】:
mark~
|
|
VC6中,為什么只有類中的static成員函數(shù),才可以做為線程啟動(dòng)函數(shù)(ThreadProc)?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元