C和C 中static變數

2021-08-07 17:23:57 字數 2820 閱讀 3134

c語言中static的變數:

1).static區域性變數

a、

靜態區域性變數在函式內定義,生存期為整個程式執行期間,但作用域與自動變數相同,只能在定義該變數的函式內使用。退出該函式後, 儘管該變數還繼續存在,但不能使用它。

b、對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。

2).static全域性變數

全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。但是他們的作用域,非靜態全域性變數的作用域是整個源程式(多個原始檔可以共同使用); 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔(.h或.cpp)內有效, 在同一源程式的其它原始檔中不能使用它(注意,這一點和c++是不同的)。

關於c語言static變數的理解:

a、若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;

b、若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;

c、靜態變數和全域性變數放在程式的全域性資料區,而不是在堆疊中分配,所以不可能導致堆疊溢位;

d、設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題(執行緒不安全);

c++中靜態資料成員的特點有::

1、靜態資料成員僅僅在初始化時不受訪問許可權的約束;

2、靜態資料成員最好不要在.h檔案中進行定義(初始化),而是放在.cpp檔案中定義(初始化);

3、靜態資料成員被類的所有物件所共享,包括類的派生類的所有物件;——即派生類和基類共享乙個靜態成員。

4、靜態資料成員的型別可是所屬類自己,即在乙個類中可以宣告該類自己的型別的靜態成員物件,但是,不可以定義普通的成員物件,(指標可以)

5、在const成員函式中,

可以修改static成員變數的值

。普通成員變數的值,是不能修改的。

6、static成員函式只能訪問static成員,不能訪問非static成員,並且static成員函式不能定義為virtual、const、volatile 函式。

詳細分析如下:

類體中的資料成員的宣告前加上static關鍵字,該資料成員就成為了該類的靜態資料成員。

和其他資料成員一樣,靜態資料成員也遵守public/protected/private訪問規則。

注意::僅僅是

初始化時不遵守public/protected/private的規則。

即:如果是private和protected的靜態成員,只能通過public的靜態成員函式進行呼叫,而不能通過類名直接訪問了。

1、

靜態資料成員的定義(初始化)不能在標頭檔案中。 

靜態資料成員實際上是類域中的全域性變數。所以,

靜態資料成員的定義(初始化)不應該被放在標頭檔案中。 

其定義方式與全域性變數相同。舉例如下: 

***.h檔案 

class base

; ***.cpp檔案 

const int base::_i=10;                 

//僅僅在定義(初始化)時不受private和protected訪問限制. 

注:不要試圖在標頭檔案中定義(初始化)靜態資料成員。在大多數的情況下,

這樣做會引起重複定義這樣的錯誤。即使加上#ifndef #define #endif或者#pragma once也不行。

2、靜態資料成員   被 類 的所有物件所共享,

包括該類派生類的物件。即派生類物件與基類物件共享基類的靜態資料成員。舉例如下: 

class base

int base::_num=0;                   //靜態資料成員的真正定義 

class derived:public base

main() 

;這個類要能建立物件,需要定義帶有引數初始化列表的建構函式,如下:

class base                

};

4、靜態資料成員的值在const成員函式中可以被合法的改變,而不破那個資料成員的值,不能在const成員函式中改變。

#include

using namespace std;

class student

;

void student::change() const

int student::geta()

void student::setb(int b)

int student::getb()

int student::a = 5;

int main(int argc,char *argv)

{student stu;

stu.setb(10);

stu.change();

cout<

即:成員函式的const約束,只起作用於類的普通成員變數,對於全域性變數,成員函式引數,成員函式內部的臨時變數起不到作用。

C 中static成員變數

1 static成員變數屬於類,不屬於某個具體的物件,即使建立多個物件,也只為static成員變數分配乙個記憶體 所有物件都是這個記憶體裡的statiic變數,如果對其做出修改也會影響到其他物件的使用 2 static成員變數必須在類外進行初始化 形如 type class name value i...

C 類中static變數

using system namespace param stathread static void main string args i console.writeline string.format j new class1 j console.read 上面的 是乙個告訴我的,讓我看看結果,我...

c 類中static 型別變數使用

在c 語音中類的靜態資料成員在初始化時比較特殊,以為它並不是在類的定義中初始化,而是在類的定義外被初始化。如下示例 include iostream include string.h class test test char strname test char strname,int num cha...