C++ 静态成员变量 在类中的实现

         C++ 静态成员变量 在类中的实现

       用法:

                 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

你可能感兴趣的:(C++ 静态成员变量 在类中的实现)