歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++ 靜態成員變量 在類中的實現

C++ 靜態成員變量 在類中的實現

日期:2017/3/1 9:58:13   编辑:Linux編程

用法:

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

Copyright © Linux教程網 All Rights Reserved