就要去實習了,迅速過第二遍《C++ Primer》,看到遺忘了的知識點就記在這了。
1.類的static數據成員的初始化不同於普通成員:static成員不是通過構造函數初始化的,而是在定義時進行初始化。即,除了在聲明類時聲明一次static數據成員,還需要在第一次使用前定義一次。書中舉例:
類Account定義的片段:
class Account {
……
private:
static double interestRate;
static double initRate();
……
}
在外部使用interestRate之前,需要進行如下定義:
// define and initialize static class member
double Account::interestRate = initRate();
2.值得注意的是:
我們在外部定義時調用了initRate(),這是一個Account類的private函數。對此書中這樣解釋:就像其他成員定義一樣,一旦成員名出現,static成員的定義就在該類作用域中。因此我們可以使用Account的private函數。
我的理解是:請注意這是定義,不是賦值。想想你在全局作用域定義類的函數時的情形,類比一下,你就知道:
double Account::initRate() {
// 這裏不是也可以直接調用Account的private函數嗎
……
}
3.另外,書中建議:爲了保證對象定義正好一次,應該將static數據成員的定義放在包含類的非內聯成員函數定義的文件中。說簡單點就是放在.cpp中,不要放在.h中,因爲.h可能會被多個文件包含,產生重複定義。
4.只有在類定義體內部的聲明中才能使用static關鍵字,定義時不能使用。在定義時如下的寫法是錯的:
static double Account::interestRate = initRate();
5.特殊的整型const static成員:
一般而言,類的static成員想普通數據成員一樣,是不能在類的定義體中初始化的(即不能像Java那樣)。但是有個例外,就是整形的const static成員。請看實例說明:
class Account {
……
private:
static double interestRate1 = initRate(); // 錯誤
double interestRate2 = 0.02; // 錯誤
static cons tint period = 30; // 正確,但是仍要在類的定義體之外進行定義
……
}
在使用period之前,我們仍需要在類的定義體之外定義,但是此時已經不需要指定初始化值了:
const int Account:: period;