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