C 靜態成員和靜態成員函式static

2021-06-29 16:18:12 字數 1567 閱讀 8996

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

靜態成員:靜態類中的成員加入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 靜態成員和靜態成員函式

一 靜態資料成員 類體中的資料成員的宣告前加上static關鍵字,該資料成員就成為了該類的靜態資料成員。和其他資料成員一樣,靜態資料成員也遵守public protected private訪問規則。同時,靜態資料成員還具有以下特點 1 靜態資料成員的定義。靜態資料成員實際是類域中的全域性變數,其定...

靜態成員和靜態成員函式

靜態成員和靜態成員函式 普通成員變數每個物件有各自的乙份,而靜態成員變數一共就乙份,為所有物件共享。靜態成員物件不需要通過物件就能訪問 class crectangle crectangle crectangle int i,int j crectangle crectangle int crect...

靜態成員和靜態成員函式

靜態成員函式的特點 1.static資料成員在類內的內部宣告,但只能在類的外部定義,在類的外部不能指定static,在類的定義時候驚醒初始化 2.static資料成員只能在課的外部進行初始化 特例 當整形const static資料成員被常量表示式初始化,就可以在類內進行初始化,但還需要在外部進行定...