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

2021-07-02 15:48:54 字數 1567 閱讀 6530

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

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

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

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

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

一、在面向過程設計中的static關鍵字 

1、靜態全域性變數 

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

特點: 

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

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

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

例(摘於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() ; 

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

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

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

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

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

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

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

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

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

c 靜態變數,靜態成員變數,靜態成員函式

c 靜態變數的生存期和程式的執行期相同,使用關鍵字static宣告 static int i 5 靜態變數和全域性變數有點類似,儲存在記憶體靜態 全域性變數區。靜態變數不會因為函式的呼叫而產生乙個副本,也不會隨著函式返回而失效,靜態變數在函式執行期間是共享的。c 類的靜態成員是解決同乙個類的不同物件...

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

靜態的成員函式,同靜態資料成員類似,它也是屬於類,而不是屬於某乙個物件的。靜態成員函式不能訪問非靜態的資料成員,它只能訪問靜態資料成員,也只能呼叫其它的靜態成員函式。原因是 當前物件的位址 this 是被隱含地傳遞到被呼叫的函式的。但乙個靜態成員函式沒有 this 指標,所以它無法訪問非靜態的成員函...

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

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