this指针和虚函数指针

this指针

指向类对象自己,有对象才有this指针

this指针表示对象的起始内存地址,即this指针的值,指向了对象起始内存。this指针的值和类第一个成员变量的地址一样

#include<iostream>
class base
{
public:
	base()
	{
		std::cout << "this:" << this << std::endl;
		std::cout << "&a:" << &a << std::endl;
	}
	~base() = default;
	int a = 0;
};
int main()
{
	base b;
}

输出结果:

this:004FF888
&a:004FF888

虚函数指针

当类中含有虚函数时,类的成员会存在一个虚函数指针,虚函数指针指向虚函数表,虚函数表储存虚函数的地址。
将上面的析构函数变成虚函数:

#include<iostream>
class base
{
public:
	base()
	{
		std::cout << "this:" << this << std::endl << "&a:" << &a << std::endl;
	}
	virtual~base() = default;

	int a = 0;

}; 
int main()
{
	base b;
	std::cout << "b的字节:" << sizeof(b)<< "  a的字节:" << sizeof(b.a) << std::endl;
}

在32位操作系统下输出如下:

this:0053FB0C
&a:0053FB10
b的字节:8  a的字节:4

分析结果:

可以看到,b字节数为8,a为4

对象首地址(this指针)为0C,成员a的地址为10,很明显差了4个字节数量,所以剩下的4个字节是虚函数指针

在这里插入图片描述

注意:即使你调换了成员定义顺序,第一个成员的內存仍然是虚函数指针

this指针和虚函数指针的关系

可以发现当类有虚函数时候,类的第一个成员变量是一个虚函数指针(_vfptr),根据this指针的值和第一个成员变量地址相同(this指针指向第一个成员变量)。因此当有虚函数时,this指针的值等于虚函数指针的地址(this指针指向虚函数指针)

#include<iostream>
class base1
{
public:
	base1()
	{
		std::cout << "base1-this的值:" <<std::hex<< this << std::endl;

	}
	virtual ~base1() = default;

	int a = 0;

};
int main()
{
	base1 b1;
	//b3为指针,b3指向b1
	base1* b3 = &b1;
	//将b3转换为long类型的指针,赋值给pvptr,指向b1,因此pvptr的值等于this指针
	long* pvptr = (long*)(b3);
	//*pvptr解引用得到pvptr(this)指向的对象,将pvptr(this)指向的对象转换为long *类型指针,赋值给vptr
	long* vptr = (long*)(*pvptr);
	//*pvptr解引用得到pvptr(this)指向的对象(这个解引用得到的对象其实就是虚函数指针,也就是指针b3指向了虚函数指针(成员变量)。)
	auto vptr2 = (*pvptr);


	std::cout << "pvptr:" << pvptr << std::endl;
	std::cout << "vptr:" << vptr << std::endl;
	std::cout << "vptr2:" << vptr2 << std::endl;
	return 0;
}

输出结果:

base1-this的值:004FFED4
pvptr:004FFED4
vptr:00B6DB1C
vptr2:b6db1c

在这里插入图片描述

所以

在这里插入图片描述

11983644就是16进制的vptr地址转换而来的

this==&_vfptr;//this指针等于虚函数指针的地址
或者:
*this==_vfptr;//this指针的解引用(指向的对象)就是虚函数指针

228187)]

11983644就是16进制的vptr地址转换而来的

this==&_vfptr;//this指针等于虚函数指针的地址
或者:
*this==_vfptr;//this指针的解引用(指向的对象)就是虚函数指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值