C語言中的static變數和C 靜態資料成員

2021-06-19 15:40:09 字數 2728 閱讀 9217

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變數 static函式

摘自 1.static 變數 靜態變數的型別 說明符是static。靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數。例如外部變數雖屬於靜態 儲存方式,但不一定是靜態變數,必須由 static加以定義後才能成為靜態外部變數,或稱靜態全域性變數。2.靜態區域性變數 靜態區域性...

C語言中static變數詳解

static翻譯出來是 靜態 靜止 的意思,在 c語言中的意思其實和它的本意差不多,表示 靜態 或者 全域性 的意思,用來修飾變數和函式。經 static 修飾過後的變數或者函式的作用域或者儲存域會發生變化,而由 static 修飾的變數在初始值方面也會表現出 static 關鍵字的優勢。想知道經 ...

C語言中static變數詳解

static翻譯出來是 靜態 靜止 的意思,在c語言中的意思其實和它的本意差不多,表示 靜態 或者 全域性 的意思,用來修飾變數和函式。經static修飾過後的變數或者函式的作用域或者儲存域會發生變化,而由static修飾的變數在初始值方面也會表現出static關鍵字的優勢。想知道經static修飾...