加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱故事小小网_铜陵站长网 (http://www.0562zz.com/)- 视频终端、云渲染、应用安全、数据安全、安全管理!
当前位置: 首页 > 教程 > 正文

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

发布时间:2021-12-13 16:30:01 所属栏目:教程 来源:互联网
导读:用法: 1、静态成员变量,在类中以static 标识,格式: static type value; 2、静态成员变量需要在类外面初始化才能够使用。初始化不要在构造函数初始化,会破坏数据(看例子)。类外初始化会在全局数据区申请空间;类外只作了声明没有进行赋值的话,就会在b

用法:
 
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]:%dn",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

(编辑:我爱故事小小网_铜陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读