再說c++ static

類外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);


類的靜態成員函數


  類的C++靜態成員函數只能訪問類的靜態數據成員,而不能訪問類中的普通函數成員(非靜態數據成員),因爲普通數據成員只有類的對象存在時纔有意義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章