静态数据成员
来源:互联网 发布:宁波php招聘 编辑:程序博客网 时间:2024/04/30 17:51
1.当类中定义了静态数据成员时,由于静态数据成员和静态变量原理相同(是一个含有作用域的特殊全局变量),因此该静态数据成员的初值会被写入编译链接后的执行文件中。
2.当程序被加载时,OS将执行文件中的数据读到对应的内存单元里,静态数据成员便已经存在,而这时类并没有实例对象。所以静态数据成员和对象之间的生命周期不同,并且静态数据成员也不属于某一对象,与对象之间是一对多的关系。
3.静态数据成员仅仅和类相关,和对象无关,多个对象可以共同拥有同一个静态数据成员。
class
CStatic
{
public
:
static
int
m_snInt;
int
m_nInt;
};
int
CStatic::m_snInt = 12;
int
main(
void
) {
CStatic a;
CStatic b;
int
nSize =
sizeof
( a );
printf
(
"CStatic:%d\r\n"
, nSize );
printf
(
"%x\r\n"
, &a.m_nInt);
printf
(
"%x\r\n"
, &a.m_snInt);
printf
(
"%x\r\n"
, &b.m_nInt);
printf
(
"%x\r\n"
, &b.m_snInt);
return
0;
}
因为静态成员有此特性,所以在计算类和对象的长度时,静态成员属于特殊的独立个体,不被计算在其中。
1.静态数据成员的地址是个常量地址,可通过立即数间接寻址的方式访问。
2.普通数据成员的地址在EBP-X中是一个栈空间地址。
3.普通数据成员函数只有在类对象产生后才存在,地址值无法确定,只能以寄存器相对间接寻址的方式访问。
所以,在成员函数中使用这两种数据成员时,由于静态成员变量不属于任何对象,因此访问时无需this指针。而普通的数据成员数据对象所有,访问时需要this指针。
class
CStatic
{
public
:
void
ShowNumber();
static
int
m_snInt;
int
m_nInt;
};
int
CStatic::m_snInt = 9;
void
CStatic::ShowNumber()
{
printf
(
"m_nInt = %d, m_snInt = %d\r\n"
, m_nInt, m_snInt );
}
int
main(
void
) {
CStatic Static;
Static.m_snInt = 1;
Static.m_nInt = 3;
Static.ShowNumber();
return
0;
}
静态数据成员中反汇编代码中很难被识别,因为其展示形态与全局变量相同,很难被还原成对应的高级代码。可参考其代码的功能。
1.当类中定义了静态数据成员时,由于静态数据成员和静态变量原理相同(是一个含有作用域的特殊全局变量),因此该静态数据成员的初值会被写入编译链接后的执行文件中。
0 0
- 静态数据成员
- 静态数据成员
- 静态数据成员调用
- 静态数据成员
- C++静态数据成员
- 主题:静态数据成员
- 静态数据成员
- C++静态数据成员
- c++静态数据成员
- 静态数据成员 C++
- 静态数据成员
- C++ 静态数据成员
- 静态数据成员
- 关注静态数据成员
- 静态数据成员
- 静态数据成员应用
- 静态数据成员
- 静态数据成员
- Ubuntu 12.04(32位)安装Oracle 11g(32位)全过程以及几乎所有问题的解决办法
- [Linux]C语言遍历文件和目录
- MachineLearning(Andrew)Week1
- codeforce 400 C
- 二周 项目3 文件+结构体实现使用功能
- 静态数据成员
- linux下clang+llvm3.3安装(ubuntu)
- 对话框包含视类头文件出错
- java中多线程的实现方式有两种
- Logistic Function == Sigmoid Function
- 机构题成绩处理
- 动作栏——ActionBar(一)
- office2007新建 Microsoft Office Word 文档.docx,打开后弹出转换文件对话框的解决办法
- javascript匿名函数