靜態變量與靜態函數

堆與棧

1、棧區(stack):有編譯器自動分配釋放,存放函數的參數值、局部變量的值等,操作凡是類似於數據結構中的棧;

2、堆區(heap):一般有程序員分配和釋放(動態存儲分配),分配方式類似於鏈表;

3、全局區(static):全局變量和靜態變量的存儲,有系統釋放;

4、文字常量區:常量字符串存放,系統釋放;

5、程序代碼區:存放函數體的二進制代碼。

堆與棧的區別:

1.棧內存存儲的是局部變量而堆內存存儲的是實體;

2.棧內存的更新速度要快於堆內存,因爲局部變量的生命週期很短;

3.棧內存存放的變量生命週期一旦結束就會被釋放,而堆內存存放的實體會被垃圾回收機制不定時的回收。

全局變量靜態(static

1)內存中的位置:靜態存儲區(靜態存儲區在整個程序運行期間存在);

2)初始化:未經初始化的靜態全局變量會被程序自動初始化爲0,普通全局變量未經初始化的值是任意的;

3)作用域:全局靜態變量的只在聲明它的文件下是可見的(從定義到文件結尾),普通全局變量在整個工程中是可見的。

優點:1)不會被其他文件訪問和修改;2)其他文件使用相同的名字的變量不會發生衝突

局部靜態變量

1)內存中的位置:靜態存儲區;

2)初始化:未經初始化的靜態局部變量會被程序自動初始化爲0,普通局部變量未經初始化的值是任意的;

3)作用域:作用域仍然是局部的,當定義它的函數或語句塊結束時,作用域也隨之結束。

static修飾局部變量時,修改了局部變量的存儲位置,從原來的佔中存儲改爲靜態存儲區。但是靜態變量離開作用域後並沒有被銷燬,仍然駐留在內存中,知道程序結束,但是不能對其訪問;

Static修飾全局變量時,它改變了全局變量的作用域,只在其聲明的文件中可見,存儲位置內有改變,仍在靜態存儲區中)

靜態函數

函數的定義和聲明默認情況下是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其他文件所用

1)靜態函數在其他文件中科技定義形同的名字,不會發生衝突;

2)靜態函數不能被其他文件所用;

3)靜態函數會被自動分配在一個一直使用的存儲區,直到退出應用程序實例,避免了調用函數時壓棧出棧,速度快很多。

<1>static全局變量與普通的全局變量有什麼區別:static全局變量只初使化一次,防止在其他文件單元中被引用;
<2>static局部變量和普通局部變量有什麼區別:static局部變量只被初始化一次,下一次依據上一次結果值;
<3>static函數與普通函數有什麼區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝。

C++類中靜態變量與靜態函數

在類中,靜態成員可以實現多個對象之間的數據共享,並且使用靜態數據成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態成員是類的所有對象中共享的成員,而不是某個對象的成員。使用靜態數據成員可以節省內存,因爲它是所有對象所公有的,因此,對多個對象來說,靜態數據成員只存儲一處,供所有對象共用。靜態數據成員的值對每個對象都是一樣,但它的值是可以更新的。只要對靜態數據成員的值更新一次,保證所有對象存取更新後的相同的值,這樣可以提高時間效率。

1、靜態變量的定義:靜態數據成員定義或說明時在前面加關鍵詞static

2、靜態變量初始化:與一般成員初始化不同<數據類型><類名>::<靜態數據成員名>=<>

(1) 初始化在類體外進行,而前面不加static,(這點需要注意)以免與一般靜態變量或對象相混淆。

(2) 初始化時不加該成員的訪問權限控制符privatepublic等。

(3) 初始化時使用作用域運算符來標明它所屬類,因此,靜態數據成員是類的成員,而不是對象的成員。

3、靜態數據成員是靜態存儲的,它是靜態生存期,必須對它進行初始化。

4靜態方法不能直接調用一般成員,可以通過對象引用實現調用。

靜態成員函數和靜態數據成員一樣,它們都屬於類的靜態成員,它們都不是對象成員。因此,對靜態成員的引用不需要用對象名。在靜態成員函數的實現中不能直接引用類中說明的非靜態成員(原因是,非靜態成員函數需要傳入一個this指針),可以引用類中說明的靜態成員(這點非常重要)。如果靜態成員函數中要引用非靜態成員時,可通過對象來引用。從中可看出,調用靜態成員函數使用如下格式:<類名>::<靜態成員函數名>(<參數表>);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章