有一個類A,其數據成員如下:
class A
{
...
private:
int a;
public:
const int b;
float* &c;
static const char* d;
static double* e;
};
則構造函數中,成員變量一定要通過初始化列表來初始化的是:b,c
構造函數中,成員變量一定要通過初始化列表來初始化的有以下幾種情況:
- const常量成員,因爲常量只能在初始化,不能賦值,所以必須放在初始化列表中;
- 引用類型,引用必須在定義的時候初始化,並且不能重新賦值,所以也要寫在初始化列表中;
- 沒有默認構造函數的類類型,因爲使用初始化列表可以不必調用默認構造函數來初始化,而是直接調用拷貝構造函數;
對於static const char* d 來說,因爲static屬於類並不屬於具體的對象,所以 static成員是不允許在類內初始化的,那麼static const 成員是不是在初始化列表中呢?
答案是NO
原因在於:
- 是static屬於類,它在未實例化的時候就已經存在了,而構造函數的初始化列表,只有在實例化的時候才執行。
- 是static成員不屬於對象。我們在調用構造函數自然是創建對象,一個跟對象沒直接關係的成員要它做什麼呢。
因此,由static修飾的變量不需要在構造函數中初始化。