static變數問題

2022-05-04 01:24:08 字數 1712 閱讀 2661

static 的兩大作用:

一、控制儲存方式:

static被引入以告知編譯器,將變數儲存在程式的靜態儲存區而非棧上空間。

1、引出原因:函式內部定義的變數,在程式執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函式在棧上分配的空間在此函式執行結束時會釋放掉,這樣就產生了乙個問題: 如果想將函式中此變數的值儲存至下一次呼叫時,如何實現?

最容易想到的方法是定義乙個全域性的變數,但定義為乙個全域性變數有許多缺點,最明顯的缺點是破壞了此變數的訪問範圍(使得在此函式中定義的變數,不僅僅受此函式控制)。

2、 解決方案:因此c++ 中引入了static,用它來修飾變數,它能夠指示編譯器將此變數在程式的靜態儲存區分配空間儲存,這樣即實現了目的,又使得此變數的訪問範圍不變。

二、控制可見性與連線型別 :

static還有乙個作用,它會把變數的可見範圍限制在編譯單元中,使它成為乙個內部連線,這時,它的反義詞為」extern」.

static作用分析總結:static總是使得變數或物件的儲存形式變成靜態儲存,連線方式變成內部連線,對於區域性變數(已經是內部連線了),它僅改變其儲存方式;對於全域性變數(已經是靜態儲存了),它僅改變其連線型別。

類中的static成員:

一、出現原因及作用:

1、需要在乙個類的各個物件間互動,即需要乙個資料物件為整個類而非某個物件服務。

2、同時又力求不破壞類的封裝性,即要求此成員隱藏在類的內部,對外不可見。

類的static成員滿足了上述的要求,因為它具有如下特徵:有獨立的儲存區,屬於整個類。

二、注意:

1、對於靜態的資料成員,聯結器會保證它擁有乙個單一的外部定義。靜態資料成員按定義出現的先後順序依次初始化,注意靜態成員巢狀時,要保證所巢狀的成員已經初始化了。消除時的順序是初始化的反順序。

2、類的靜態成員函式是屬於整個類而非類的物件,所以它沒有this指標,這就導致了它僅能訪問類的靜態資料和靜態成員函式。

static 是c++中很常用的修飾符,它被用來控制變數的儲存方式和可見性,下面我將從 static 修飾符的產生原因、作用談起,全面分析static 修飾符的實質。

1、靜態全域性變數

在全域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態全域性變數。我們先舉乙個靜態全域性變數的例子,如下:

//example 1

#include

void fn();

static int n; //定義靜態全域性變數

void main()

void fn()

通常,在函式體內定義了乙個變數,每當程式執行到該語句時都會給該區域性變數分配棧記憶體。但隨著程式退出函式體,系統就會收回棧記憶體,區域性變數也相應失效。

但有時候我們需要在兩次呼叫之間對變數的值進行儲存。通常的想法是定義乙個全域性變數來實現。但這樣一來,變數已經不再屬於函式本身了,不再僅受函式的控制,給程式的維護帶來不便。

靜態區域性變數正好可以解決這個問題。靜態區域性變數儲存在全域性資料區,而不是儲存在棧中,每次的值保持到下一次呼叫,直到下次賦新值。

靜態區域性變數有以下特點:

該變數在全域性資料區分配記憶體;

靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;

靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0;

它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束;

static 變數和static 函式

在c語言程式設計中,static的乙個作用是資訊遮蔽!比方說,你自己定義了乙個檔案 該檔案中有一系列的函式以及變數的宣告和定義!你希望該檔案中的一些函式和變數只能被該檔案中的函式使用,那麼,你可以在該函式 變數的前面加上static,代表他們只能被當前檔案中的函式使用!而在c 中,用static來作...

Static 變數和Static函式

static變數和static函式 一 static 變數static變數大致分為三種用法 1.用於區域性變數中,成為靜態區域性變數.靜態區域性變數有兩個用法,記憶功能和全域性生存期.2.用於全域性變數,主要作用是限制此全域性變數被其他的檔案呼叫.3.用於類中的成員.表示這個成員是屬於這個類但是不屬...

static 方法和static 變數

static方法不能直接訪問類內的非static變數和不能呼叫this,super語句分析 大家都知道在static方法中,不能訪問類內非static成員變數和方法。可是原因是什麼呢?這首先要從static方法的特性說起。static方法,即類的靜態成員經常被稱為 成員變數 class member...