在C語言中有待用資料類型,聲明一個待用資料類型意味著:該變數的生存周期是
靜態,即在程式的開始即分配到程式,終止時才釋放。在C++中,聲明一個類的待用資料成員意味著所有的執行個體只有該資料成員的一個拷貝。
《深入淺出MFC》這樣解釋:
Static 成員不屬於對象的一部分,而是類的一部分。所以程式可以在沒有誕生分和
對象的時候就處理此種成員變數.但必須首先初始化它。
不要把static成員變數的初始化操作安排在類的建構函式中,因為建構函式可能一
再被調用,而變數的初值只應該設定一次。也不要把初始化操作安排在標頭檔中,
因為它可能被載入到許多地方,因此就可能執行許多次。你應該在應用程式檔案中,
類以外的任何地方設定其初始值。例如在main之中,或者全域函數中,或任何函數
之外:
double SavingAccount :: m_rate = 0.0075;//設定atatic成員變數初值
void main() {… …}
這麼做可曾考慮到m_rate是個private資料?沒關係,設定static成員變數初值
時,不受任何存取許可權的束縛。請注意,static成員變數的類型也出現在初值設定
中,因為這是一個初值設定操作,不是一個賦值(assignment)操作。事實上,staic
變數在這個時候(而不在類聲明中)才定義出來。如果你沒有做這個初始化操作,
會產生串連錯誤。
下面是存取static成員變數的一種方式,注意,此刻還沒有任何對象執行個體:
//第一種存取方式:
void main()
{
SavingAccount::m_rate = 0.0075; //欲此成立,須把m_rate改為public
}
下面是這種情況則是產生一個對象後,通過對象來處理static成員變數:
//第二種存取方式:
void main()
{
SavingAccount myAccount;
myAccount.m_rate = 0.0075; //欲此成立,須把m_rate改為public
}
Static成員變數並不是因為對象的實現才得以存在的,它本來就存在,你可以想象
它是一個全域變數。只要access level允許,任何函數都可以存取static成員變
量。但是如果你希望在產生任何對象之前就存取其class的private static成員
變數,則必須設計一個static成員函數:
由於static成員函數不需要藉助於任何對象,就可以被調用,所以編譯器不會為它
暗加一個this指標。因此static成員函數無法處理類之中的non-static成員變數。