C 靜態成員變數和靜態成員函式

2021-07-23 11:13:50 字數 3301 閱讀 4500

***原文

注意:

類中靜態變數在類外初始化格式:

<資料型別><類名>::<靜態資料成員名>=<值>

加上宣告是為了在建構函式之前執行。

private: 

inta,b,c;

static

const

intsum;//宣告靜態資料成員!!!

!!!!

!!!!

!!!!

}; const

intmyclass::sum=;//定義並初始化靜態資料成員!!!

!!!!

!

資料成員可以分靜態變數、非靜態變數兩種.

靜態成員: 靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名::靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜態的成員.

非成靜態員: 所有沒有加static的成員都是非靜態成員,當類被例項化之後,可以通過例項化的類名進行訪問.非靜態成員的生存期決定於該類的物件的生存期..而靜態成員則不存在生存期的概念,因為靜態成員始終駐留在內容中..

乙個類中也可以包含靜態成員和非靜態成員,類中也包括靜態建構函式和非靜態建構函式..

分兩個方面來總結,第一方面主要是相對於面向過程而言,即在這方面不涉及到類,第二方面相對於物件導向而言,主要說明static在類中的作用。

定義:在全域性變數前,加上關鍵字 static 該變數就被定義成為了乙個靜態全域性變數。

特點:

-   a、該變數在全域性資料區分配記憶體。

-   b、初始化:如果不顯式初始化,那麼將被隱式初始化為0(自動變數是隨機的,除非顯式地初始化)。

-   c、訪變數只在本原始檔可見,嚴格的講應該為定義之處開始到本檔案結束。

-   d、檔案作用域下宣告的const的常量預設為static儲存型別。

例(摘於c++程式設計教程—錢能主編p103): 「`

//example 1

#include

void fn();

static

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

void main()

void fn()

void fn()//定義靜態函式

; int

myclass::sum=0;//定義並初始化靜態資料成員!!!

!!!!

!myclass::myclass(int

a,int

b,int

c)

void

myclass::getsum()

void

main()

可以看出,靜態資料成員有以下特點:

對於非靜態資料成員,每個類物件都有自己的拷貝。而靜態資料成員被當作是類的成員。無論這個類的物件被定義了多少個,靜態資料成員在程式中也只有乙份拷貝,由該型別的所有物件共享訪問。也就是說,靜態資料成員是該類的所有物件所共有的。對該類的多個物件來說,靜態資料成員只分配一次記憶體,供所有物件共用。所以,靜態資料成員的值對每個物件都是一樣的,它的值可以更新;

靜態資料成員儲存在全域性資料區。靜態資料成員定義時要分配空間,所以不能在類宣告中定義。在example 5中,語句int myclass::sum=0;是定義靜態資料成員;

靜態資料成員和普通資料成員一樣遵從public,protected,private訪問規則;

因為靜態資料成員在全域性資料區分配記憶體,屬於本類的所有物件共享,所以,它不屬於特定的類物件,在沒有產生類物件時其作用域就可見,即在沒有產生類的例項時,我們就可以操作它;

靜態資料成員初始化與一般資料成員初始化不同。

靜態資料成員初始化的格式為:

==<資料型別><類名>::<靜態資料成員名>=<值>==

類的靜態資料成員有兩種訪問形式:

==<類物件名>.<靜態資料成員名> 或<類型別名>::<靜態資料成員名>==

如果靜態資料成員的訪問許可權允許的話(即public的成員),可在程式中,按上述格式來引用靜態資料成員 ;

靜態資料成員主要用在各個物件都有相同的某項屬性的時候。比如對於乙個存款類,每個例項的利息都是相同的。所以,應該把利息設為存款類的靜態資料成員。

這有兩個好處,第一,不管定義多少個存款類物件,利息資料成員都共享分配在全域性資料區的記憶體,所以節省儲存空間。

第二,一旦利息需要改變時,只要改變一次,則所有存款類物件的利息全改變過來了;

同全域性變數相比,使用靜態資料成員有兩個優勢:

靜態資料成員沒有進入程式的全域性名字空間,因此不存在與程式中其它全域性名字衝突的可能性;

可以實現資訊隱藏。靜態資料成員可以是private成員,而全域性變數不能;

與靜態資料成員一樣,我們也可以建立乙個靜態成員函式,它為類的全部服務而不是為某乙個類的具體物件服務。靜態成員函式與靜態資料成員一樣,都是類的內部實現,屬於類定義的一部分。普通的成員函式一般都隱含了乙個this指標,this指標指向類的物件本身,因為普通成員函式總是具體的屬於某個類的具體物件的。通常情況下,this是預設的。如函式fn()實際上是this->fn()。

但是與普通函式相比,靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標。從這個意義上講,它無法訪問屬於類物件的非靜態資料成員,也無法訪問非靜態成員函式,它只能呼叫其餘的靜態成員函式。

下面舉個靜態成員函式的例子。

//example 6 

#include

class myclass

; int myclass::sum=0;//定義並初始化靜態資料成員

myclass::myclass(int a,int b,int c)

void myclass::getsum() //靜態成員函式的實現

關於靜態成員函式,可以總結為以下幾點:

出現在類體外的函式定義不能指定關鍵字static;

靜態成員之間可以相互訪問,包括靜態成員函式訪問靜態資料成員和訪問靜態成員函式;

非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員;

靜態成員函式不能訪問非靜態成員函式和非靜態資料成員;

由於沒有this指標的額外開銷,因此靜態成員函式與類的全域性函式相比速度上會有少許的增長;

呼叫靜態成員函式,可以用成員訪問操作符(.)和(->)為乙個類的物件或指向類物件的指標呼叫靜態成員函式.

C 靜態成員變數和靜態成員函式

資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜...

C 靜態成員變數和靜態成員函式

資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜...

C 靜態成員變數和靜態成員函式

靜態成員變數和靜態資料成員並不屬於某乙個類物件,而是整個類,為所有物件共有,下面介紹 靜態成員變數和靜態資料成員的一些特徵 class a int tmain int argc,tchar argv 結果如下 1 class a const char a c b 可以通過作用域操作符,類的物件,引用...