***原文
注意:類中靜態變數在類外初始化格式:
<資料型別><類名>::<靜態資料成員名>=<值>
加上宣告是為了在建構函式之前執行。
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 可以通過作用域操作符,類的物件,引用...