11.this指针
class CClock
{
int m_Hour;
int m_Minute;
int m_Second;
void getHour(){};
void setHour(){};
}
问题1:上面的类CClock占多少个字节?
答案1:通过sizeof(CClock)可以知道CClock占用12个字节
思考1:类的大小仅仅是数据成员的大小吗?类中的成员函数为什么不占用内存?
CClock clock1;
CClock clock2;
clock1.getHour();
clock2.getHour();
通过函数指针取clock1.getHour与clock2.getHour成员函数的地址发现,虽然是两个不同对象的成员函数,但是它们的地址相同
谜题揭晓:
同一个类的成员函数地址是一样的,并且不占用类的大小
用一个类的对象的成员函数是公用的
也就是说,同一个类数据成员是独立的,但成员函数却是公用的
问题2:既然类的成员函数是公用的,那么在clock1.getHour()和clock2.getHour()调用类的成员函数时,成员函数是如何区分那个对象正在对其进行调用?
答案2:
(1)这个问题的回答需要结合上一节中使用C语言模拟类的封装,当我们在结构体外部书写成员函数时,实际上向成员函数中传递了一个结构体指针,这个结构体指针就表明了目前是哪个对象正在调用该成员函数
(2)同样的道理,类的成员函数中也有一个这样的隐藏指针this,this指明了目前是哪个对象正在调用成员函数
void CClock::setHour(int nHour)
{
this->m_Hour = nHour;//this指针指向当前调用该成员函数的对象
return;
}
this指针
对类的成员函数调用时会偷偷地传递this指针,并且是通过__thiscall的方式进行函数调用,__thiscall表示通过寄存器ecx进行参数传递
补充:函数指针的定义及其用法