用法:
1、靜態成員變量,在類中以static 標識,格式: static <type> <value>;
2、靜態成員變量需要在類外面初始化才能夠使用。初始化不要在構造函數初始化,會破壞數據(看例子)。類外初始化會在全局數據區申請空間;類外只作了聲明沒有進行賦值的話,就會在bss區標記下來,待運行時系統會初始化為0。(至於,數據區,bss區的說明,請查看相關資料。)
3、無論創建幾個類對象,靜態變量在類中只保留一份,被多個對象共享,所以讀取和寫入時最好也有個靜態的互斥鎖把它鎖住,再進行讀寫。
查看例子原碼:cat main.cpp
例:
#include <stdio.h>
#include <unistd.h>
#include <mutex>
class CIstatic{
public:
//****************down*****************
CIstatic()
{
m_fd[0] = -1;
m_fd[1] = -1; //危險的靜態成員變量在構造函數初始化。
m_fd[2] = -1;
}
//*****************up*******************
void setVal()
{
m_fd_mutex.lock();
m_fd[0] = 1;
m_fd[1] = 2;
m_fd_mutex.unlock();
}
void printVal()
{
m_fd_mutex.lock();
printf("m_fd[0]:%d,m_fd[1]:%d,m_fd[2]:%d\n",m_fd[0],m_fd[1],m_fd[2]);
m_fd_mutex.unlock();
}
private:
static int m_fd[3];
static std::mutex m_fd_mutex;
};
int CIstatic::m_fd[3]; //類外聲明,未初始化賦值。
std::mutex CIstatic::m_fd_mutex; //類外聲明,未初始化賦值。
int main(int argc, const char *argv[])
{
CIstatic cStaticA;
cStaticA.setVal();
cStaticA.printVal();
sleep(1);
CIstatic cStaticB; //重新新建內對象。
cStaticB.printVal();
return 0;
}
編譯:g++ -std=c++0x -o test.i386.elf main.cpp
運行結果:
1、未屏蔽構造函數前:
m_fd[0]:1,m_fd[1]:2,m_fd[2]:-1
m_fd[0]:-1,m_fd[1]:-1,m_fd[2]:-1
2、屏蔽構造函數後:
m_fd[0]:1,m_fd[1]:2,m_fd[2]:0
m_fd[0]:1,m_fd[1]:2,m_fd[2]:0