由於記憶體的空間有限,我們常常關心已經使用掉了多少記憶體空間。如果我們修改上一章的鍊錶程式(程式15.5),要能計算出整個程式一共產生了多少鍊錶結點,我們該怎麼做呢?
顯然,我們需要乙個計數器。每產生乙個結點,計數器就加一;每消除乙個結點,計數器就減一。由於結點的產生和消除只會與鍊錶類或結點類的某些成員函式有關,所以這個計數器只能是乙個全域性變數了(全域性變數的概念見11.1節),否則它將無法被各個成員函式訪問和修改。
不過使用全域性變數會帶來嚴重的安全性問題。產生了多少個鍊錶結點明明是和結點類有關的,卻沒有被封裝在結點類裡面。任何函式都能修改這個全域性變數,不得不讓我們擔憂。
封裝在類內部的資料是成員資料。想象一下,如果我們給鍊錶結點類新增乙個成員資料count,那麼鍊錶結點類的定義就是這樣:
class node//定義乙個鍊錶結點類
;現在計數器是乙個成員資料,可以被鍊錶結點類的成員函式訪問,也保證它不會被隨便修改。但如果我們建立了三個結點物件a、b、c之後,我們發現a.count、b.count和c.count是三個互不相關的變數,也就是說它們的值可能是不一致的。更麻煩的是,我們不知道還會產生多少結點物件,如果新增乙個結點物件,那麼之前的每乙個結點物件的count都要發生變化!
所以,我們需要一種方法,既能把count封裝在類的內部,又能使各個物件的count相同。
我們將產生的結點個數記為count,它不是某乙個結點所具有的屬性,而應該是整個鍊錶結點類所具有的屬性,或者說它是各個結點物件的共有屬性。
如果我們把idata和cdata比作每個結點的私有財產,那麼count就是所有結點的共有財產。count能被任何乙個結點使用,但事實上無論有多少個結點,count只有乙個。這樣就不會發生a.count、b.count和c.count各不相同的情況了。
在c++中,用靜態成員資料(static data member)來描述這種共有屬性。與一般的成員資料類似,靜態成員資料也可以分為公有(public)的和私有(private)的。靜態成員資料的宣告方法為:
static 資料型別成員變數名;
下面我們來看看如何給鍊錶結點類增加乙個靜態成員資料:
class node//定義乙個鍊錶結點類
;由於靜態成員資料不是僅僅屬於某乙個具體物件的,所以它不能在建構函式中被初始化。(否則豈不是每建立乙個物件,靜態成員資料都要被初始化一次?)如果類的標頭檔案會被直接或間接地重複包含,則靜態成員資料也會被重複初始化。為了避免這個問題,我們可以將類的宣告和定義分離,如果忘記了這個問題可參見11.2節。如果類的標頭檔案絕對不會被重複包含,那麼把靜態成員資料的初始化放在類的標頭檔案中也是可以勉強接受的。
靜態成員資料的初始化語句為:
資料型別類名::靜態成員資料=初始值;
原文:
靜態成員資料 靜態物件初始化
1 靜態成員資料的定義,與靜態型別的變數的定義方式一樣,要在成員資料的定義之前加關鍵字static。2 靜態成員資料必須有確定的值,但由於在類的定義中不能對成員資料直接進行初始化,故必須在類定義的外部對靜態成員資料再宣告一次,並進行初始化,此時,前面不需要加關鍵字static。同時為了保持靜態成員資...
This指標與成員資料初始化
成員資料 預設初始化 在類中直接進行初始化 如 public int a 3 通過無參構造對資料進行初始化 舉例 public class myclass 在類中直接構造和無參初始化任選其一。主要選擇建構函式初始化,因為會破壞類的抽象性。當前物件指標this this this 表示當前建立或使用的...
cosnt成員資料的初始化
const可以用來宣告常量也就是說他的值不能被修改 const成員必須在定義的時候同時初始化,不能進行賦值如 const int a a的值不能修改,不能給它賦值,如何才能讓它一開始就擁有乙個值?1 在宣告的時候對他進行初始化 const int a 1 2 在函式中宣告的形參,在函式被呼叫時會得到...