天天看點

C++ static 靜态成員總結

1:不能通過類名來調用類的非靜态成員函數。

錯誤示範:

class Member
{
public:    
    void init()
    {  
    }
    static void output()
    {
    }
};
int main()
{
    Member::init();//✖
    Member::output();//✔
}      

2:類的對象可以使用靜态成員函數和非靜态成員函數。

1 int main()

2 {

3 Member m;

4 m.init();//✔

5 m.output();//✔

6 }

3:靜态成員函數中不能引用非靜态成員。

class Member
{
public:
    void init()
    {
    }
    static void output()
    {
        cout << x;//✖
    }
private:
    int x;
};
int main()
{
    Member m;
    m.output();
}      

4:類的非靜态成員函數可以調用用靜态成員函數,反之卻不能。

class Member
{
public:
    void init()
    {
        output();//☆
    }
    static void output()
    {
    }
};
int main()
{
    Member m;
    m.output();
}      

5:類的靜态成員變量必須先初始化再使用。

如:

#include<iostream>
using namespace std;

class Height{
private:
    static int number;
public:
    Height(){
        number++;
    }
    ~Height(){
        number--;
        cout << number <<endl;
    }
    static void output(){
        cout << number <<endl;
    }
};
int Height::number = 0;//類的靜态成員變量必須先初始化再使用,不必再加static關鍵字
int main()
{
    Height p;
    p.output();
    return 0;
}      

補充:​​典新23​​​​為什麼靜态成員變量要通過類外初始化指派?_百度知道 (baidu.com)​​

----------------------

當将類的某個資料成員聲明為static時,該靜态資料成員隻能被定義一次,而且要被同類的所有對象共享。各個對象都擁有類中每一個普通資料成員的副本,但靜态資料成員隻有一個執行個體存在,與定義了多少類對象無關。

靜态資料成員的用途之一是統計有多少個對象實際存在。

靜态資料成員不能在類中初始化,實際上類定義隻是在描述對象的藍圖,在其中指定初值是不允許的。也不能在夠造函數中初始化該成員,因為靜态資料成員為類的各個對象共享,那麼每次建立一個類的對象則靜态資料成員都要被重新初始化。

-----------------------

那什麼靜态成員能在類内初始化呢?

能在類中初始化的靜态成員隻有一種,那就是靜态常量成員。

//這樣不行
class A {
private:
    static int count = 0; // 靜态成員不能在類内初始化
};

//這樣也不行
class A {
private:
    const int count = 0; // 常量成員也不能在類内初始化
};

//但是這樣可以
class A {
private:
    static const int count = 0; // 靜态整型常量成員可以在類内初始化,但是 static const float count就不行了
};      

繼續閱讀