類外static
1)修飾全局變量——限制訪問範圍爲文件內部可見
2)修飾函數——限制訪問範圍爲文件內部可見
3)修飾函數內部局部變量——在函數中,只初始化一次(即使多次調用),並具有記憶功能
4)static不可修飾函數參數
類內static
類的靜態變量
1) c++ 類的static成員變量必須在類外進行初始化。否則不可用(詳見2)。
2) 但是當有一個類的靜態成員變量未初始化,如果之後的代碼中沒有使用到該變量,編譯運行是不會報錯的,但是如果有用到這個變量,編譯會報錯。
3) 類的靜態變量不能在類的內部進行初始化,需要在類外進行初始化。(這一點和類的普通靜態常量不一樣)
4) 類的靜態對象成員,會在main函數之前進行構造(會調用構造函數),屬於類,不屬於某個對象。
從這點可以看出,如果將某個功能函數F的實現部分放在一個類A的構造函數中調用,在另一個類B中聲明一個類A的靜態對象。就算是一個空的main函數,也一樣可以使功能函數F被調用到。
類的靜態常量
普通的類靜態常量
1) 靜態常量可以在類的內部進行初始化, 也可以在類的外部進行初始化。
class Test
{
public:
Test(){}
static const int m_s_int;
static const int m_s_int2 = 200;
};
const int Test::m_s_int = 100;
int main()
{
Test test;
cout << test.m_s_int << endl;
cout << test.m_s_int2 << endl;
return 0;
}
自定義類靜態常量
1) 自定義類靜態常量不能在類內部進行初始化。
// Apple是一個自定義的類型
class Apple
{
};
class Test
{
public:
Test(){}
static const Apple m_s_apple = Apple(); // error: a call to a constructor cannot appear in a constant-expression
static const Apple* m_s_p_apple = new Apple(); // error: `new' cannot appear in a constant-expression
};
error: `new' cannot appear in a constant-expression
error: a call to a constructor cannot appear in a constant-expression
只能像如下這樣,老老實實在類外進行初始化。
class Test
{
public:
Test(){}
static const Apple m_s_apple;
static const Apple* m_s_p_apple;
};
const Apple Test::m_s_apple = Apple();
const Apple* Test::m_s_p_apple = new Apple(RED, 100);