非靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)為什么不能訪問(wèn)本類中的非靜態(tài)成員?
靜態(tài)成員函數(shù)為什么不能訪問(wèn)本類中的非靜態(tài)成員?程序最終都將在內(nèi)存中執(zhí)行,變量只有在內(nèi)存中占有一席之地時(shí)才能被訪問(wèn)。類的靜態(tài)成員(變量和方法)屬于類本身,在類加載的時(shí)候就會(huì)分配內(nèi)存,可以通過(guò)類名直接去訪
靜態(tài)成員函數(shù)為什么不能訪問(wèn)本類中的非靜態(tài)成員?
程序最終都將在內(nèi)存中執(zhí)行,變量只有在內(nèi)存中占有一席之地時(shí)才能被訪問(wèn)。類的靜態(tài)成員(變量和方法)屬于類本身,在類加載的時(shí)候就會(huì)分配內(nèi)存,可以通過(guò)類名直接去訪問(wèn);非靜態(tài)成員(變量和方法)屬于類的對(duì)象,所以只有在類的對(duì)象產(chǎn)生(創(chuàng)建類的實(shí)例)時(shí)才會(huì)分配內(nèi)存,然后通過(guò)類的對(duì)象(實(shí)例)去訪問(wèn)。在一個(gè)類的靜態(tài)成員中去訪問(wèn)其非靜態(tài)成員之所以會(huì)出錯(cuò)是因?yàn)樵陬惖姆庆o態(tài)成員不存在的時(shí)候類的靜態(tài)成員就已經(jīng)存在了,訪問(wèn)一個(gè)內(nèi)存中不存在的東西當(dāng)然會(huì)出錯(cuò):class CA{private:int a //非靜態(tài)成員,創(chuàng)建類的實(shí)例時(shí)分配內(nèi)存,類的不同實(shí)例對(duì)應(yīng)不同的內(nèi)存區(qū)域
靜態(tài)成員和非靜態(tài)成員的區(qū)別?
非靜態(tài)成員也叫成員變量,二者區(qū)別如下 :1、名稱上的區(qū)別成員變量也叫實(shí)例變量;靜態(tài)變量也叫類變量。2、內(nèi)存存儲(chǔ)的區(qū)別成員變量存儲(chǔ)到堆內(nèi)存的對(duì)象中,靜態(tài)變量存儲(chǔ)到方法區(qū)的靜態(tài)區(qū)中。3、生命周期不同成員變量隨著對(duì)象的出現(xiàn)而出現(xiàn),隨著對(duì)象的消失而消失。靜態(tài)變量隨著類的出現(xiàn)而出現(xiàn),隨著類的消失而消失。靜態(tài)數(shù)據(jù)成員和普通數(shù)據(jù)成員區(qū)別較大,體現(xiàn)在下面幾點(diǎn):(1)普通數(shù)據(jù)成員屬于類的一個(gè)具體的對(duì)象,只有對(duì)象被創(chuàng)建了,普通數(shù)據(jù)成員才會(huì)被分配內(nèi)存。而靜態(tài)數(shù)據(jù)成員屬于整個(gè)類,即使沒(méi)有任何對(duì)象創(chuàng)建,類的靜態(tài)數(shù)據(jù)成員變量也存在。(2)因?yàn)轭惖撵o態(tài)數(shù)據(jù)成員的存在不依賴與于任何類對(duì)象的存在,類的靜態(tài)數(shù)據(jù)成員應(yīng)該在代碼中被顯式地初始化,一般要在類外進(jìn)行,例如上例。在C 11標(biāo)準(zhǔn)中,我們可以為靜態(tài)成員提供const整數(shù)類型的類內(nèi)初始值,不過(guò)要求靜態(tài)成員必須是字面值常量類型的constexpr(源自C Primer中文版270頁(yè))。