C 靜態成員 靜態資料成員和靜態函式成員

2021-08-04 21:41:58 字數 1413 閱讀 1672

由關鍵字static修飾說明的類成員,成為靜態類成員(static class member),包括:靜態資料成員和靜態函式成員。類的靜態成員為其所有物件共享,不管有多少物件,靜態成員只有乙份存於公用記憶體中。

雖然使用static修飾說明,但與函式中的靜態變數有明顯差異。

在類定義中,用關鍵字static修飾的資料成員為靜態資料成員。該類產生的所有物件共享系統為靜態成員分配的乙個儲存空間,而這個儲存空間是在編譯時分配的,在定義物件時不再為靜態成員分配空間。靜態資料實際上是該類所有物件所共有的,它更像在面向過程程式設計時的全域性變數,可提供同一類的所有物件之間資訊交換的捷徑。

正因為靜態資料成員不屬於類的某一特定物件,而是屬於整個類的,所以使用時可用以下格式:

類名::靜態資料成員名

【例4.9】用靜態資料成員計算由同一類建立的物件的數量。

#include

class ctest

{private:

static int count;//注意私有

public:

ctest()

{++count;

cout<<"物件數量="《執行程式後輸出:

物件數量=1 //a[0]建構函式產生

物件數量=2 //a[1]建構函式產生

物件數量=3 //a[2]建構函式產生

物件數量=2 //a[2]析構函式產生

物件數量=1 //a[1]析構函式產生

物件數量=0 //a[0]析構函式產生

此例中a行是對靜態成員資料資料作定義性說明,必須在檔案作用域中作一次並只能做一次說明,只有在這時c++編譯器為靜態資料成員分配儲存空間。c++靜態資料成員預設的初值為0,所以a行中「=0」是可以省去的。

特別要注意不管靜態變數是私有或公有,定義性說明均有效。

◆ 1、函式成員說明為靜態,將與該類的不同物件無關。嚴格地講,在邏輯上該函式成員只有乙個拷貝。

靜態函式成員的呼叫,在物件之外可以採用下面的方式: 類名::函式名

與靜態資料成員相反,為使用方便,靜態函式成員多為公有的。

【例4.8_2】與靜態資料成員相反,為使用方便,靜態函式成員多為公有的。在例4.8中的複數類中的函式成員print(),如被說明為靜態的則可如下表達:

static void print()

{cout<<」real=」在本例中print()函式應改為:

static void print(complex & ob)

{cout<<」real=」<◆ 2、如果靜態成員函式在類定義之外定義時,則不能在定義時再加static,這一點與友元函式類似。因為static不屬於資料型別組成部分。

因為c++在產生類的物件時,為了減少物件所佔空間,物理上將同一類的所有物件的成員函式只保留乙個拷貝,所以一般情況下定義靜態函式不能取得明顯好處,只有邏輯上的優點。反而在使用上變得不方便,通常是沒有必要去定義靜態成員函式的。

C 靜態成員函式和靜態資料成員

當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...

C 靜態資料成員和靜態成員函式

1.如何實現屬於某個類的所有物件共享某個資料?解決的辦法 將所要共享的資料說明為全域性變數,但這將破壞資料的封裝性 較好的解決辦法是將所要共享的資料說明為類的靜態成員。2.靜態資料成員是類中所有物件共享的成員,而不是某個物件的成員,所以必須對它初始化,且對它的初始化不能在建構函式中進行 靜態資料成員...

C 靜態資料成員和靜態成員函式

在c 物件導向程式設計過程當中,物件與物件之間的資料不是共享,在設計類的時候,有時候需要一些物件之間共享的資料,除了把所要共享的資料設定為全域性資料或者函式之外,還可以利用c 的靜態機制。1 靜態資料成員 class 類名 靜態資料成員是所有物件共享的,其所佔的記憶體空間不會因為某個物件的產生而分配...