目录
静态成员变量的存取
- 静态成员变量,可以当做一个全局量,但是他只在类的空间内可见;引用时用 类名::静态成员变量名
- 静态成员变量只有一个实体,保存在可执行文件的数据段的;
class MYACLS public: int m_i; static int m_si; //声明而不是定义,只是一个符号标记,此时不分配内存 int m_j; }; int MYACLS::m_si = 10; //这个是定义,在内存空间中分配内存 int main() { MYACLS myobj; MYACLS *pmyobj = new MYACLS(); cout << MYACLS::m_si << endl; cout << myobj.m_si << endl; cout << pmyobj->m_si << endl; return 0; }
- 输出
class MYACLS public: int m_i; static int m_si; //声明而不是定义,只是一个符号标记,此时不分配内存 int m_j; }; int MYACLS::m_si = 10; //这个是定义,在内存空间中分配内存 int main() { MYACLS myobj; MYACLS *pmyobj = new MYACLS(); MYACLS::m_si = 1; myobj.m_si = 2; pmyobj->m_si = 3; printf("myobj.m_i = %p\n", &myobj.m_i); printf("pmyobj->m_i = %p\n", &pmyobj->m_i); printf("MYACLS::m_si = %p\n", &MYACLS::m_si); printf("myobj.m_si = %p\n", &myobj.m_si); printf("pmyobj->m_si = %p\n", &pmyobj->m_si); return 0; }
- 分析静态成员变量的三种方式:
- 程序运行输出分析
- 在栈和堆上分配内存的成员变量,每次执行程序都改变。
- 分配到数据段上的静态成员变量每次执行都是分配到相同地址的内存空间,这个地址是编译时就确定好了,存到了编译出的可执行文件中
非静态成员变量的存取(普通的成员变量)
- 存放在类的对象中,存取通过类对象(或者类对象指针)
class MYACLS : public FAC { public: int m_i; static int m_si; //声明而不是定义 int m_j; void myfunc() { m_i = 5; m_j = 6; } }; int MYACLS::m_si = 10; //这个是定义 int main() { MYACLS *pmyobj = new MYACLS(); pmyobj->myfunc(); return 0; }
- 分析pmyobj->myfunc()
//编译器角度:MYACLS::myfunc(pmyobj) MYACLS::myfunc(MYACLS *const this) //编译器添加参数this { this->m_i = 5; this->m_j = 5; }
对于普通成员的访问,编译器是把类对象的首地址加上成员变量的偏移值
class MYACLS : public FAC { public: int m_i; static int m_si; //声明而不是定义 int m_j; void myfunc() { m_i = 5; m_j = 6; } }; int MYACLS::m_si = 10; //这个是定义 int main() { MYACLS *pmyobj = new MYACLS(); pmyobj->myfunc(); printf("MYACLS::m_i = %d\n", &MYACLS::m_i); printf("MYACLS::m_j = %d\n", &MYACLS::m_j); return 0; }
- &myobj + 4 等于 &myobj.m_j
- 调试分析对应的汇编代码:
- 运行输出
class FAC { public: int m_fai; int m_faj; }; class MYACLS : public FAC { public: int m_i; static int m_si; //声明而不是定义 int m_j; void myfunc() { m_i = 5; m_j = 6; } }; int MYACLS::m_si = 10; //这个是定义 int main() { MYACLS *pmyobj = new MYACLS(); pmyobj->myfunc(); printf("MYACLS::m_i = %d\n", &MYACLS::m_i); printf("MYACLS::m_j = %d\n", &MYACLS::m_j); return 0; }
- 调试分析对应的汇编代码
- 运行输出
- 如果添加
int main(){ ... pmyobj->m_faj = 7; return 0; }
- 调试查看