深入探讨this指针:从汇编的角度考虑

本文深入探讨C++中的this指针,从汇编角度解析其在成员函数中的工作原理。通过对win7下VS2010的测试,作者发现常见的this指针理解可能并不全面,挑战了成员函数默认参数为this的传统观点。
摘要由CSDN通过智能技术生成

深入探讨this指针:从汇编的角度考虑

        

        说道this指针想必大家都不陌生,在C++中,this指针是一个常量指针,形如(类名::*const this)。它指向当前正在起作用的对象自身。成员函数中的this指针貌似有些奇特,到底从何来?记得很久以前我认为他理所当然,当时我在想自己的函数认识自己很正常啊,但是当我认识到,类中函数其实只有一份拷贝的时候,才开始考虑如此多的对象,在调用同一份拷贝的函数时,不同的对象调用时this指针是不一样的,也就是说函数内部其实并没有一个固定的this指针,那么this指针到底是如何与函数绑定的呢?后来接触到一种说话成员函数其实有一个默认参数,那就是this指针,也就是说this指针也不过是对象在调用函数时将自身地址传递给了所谓的this函数参数罢了,这在大多数场合都是完全正确的,在不涉及细节的情况下我们完全有理由这么认为。不过今天我发现似乎这个说法还不够严谨(win7  vs2010测试结果)。

知识引入:
《深入探索C++对象模型》中提到成员函数时,当成员函数不是静态的,虚函数,那么我们有以下结论:
(1) &类名::函数名 获取的是成员函数的实际地址;
(2) 对于函数x来讲obj.x()编译器转化后表现为x(&obj),&obj作为this指针传入。
(3) 无法通过强制类型转换在类成员函数指针与其外形几乎一样的普通函数指针之间进行有效的转换。

案例一:正常的获取地址
#include <stdio.h>
#include <string>
using namespace std;
class Point{
public:
	void x()
	{
		printf("call Point::x()\n");
	}
};
int main()
{
	printf("&Point::x = 0x%x\n",&Point::x);
	Point obj;
	obj.x();

	void (Point::*xaddr)() = &Point::x;
	typedef void (*FUNC)();
	//FUNC px = (FUNC)xaddr;  //语法错误 无效的转换
	//FUNC ppx = static_cast<FUNC>(&Point::x); //语法错误  无效的转换
	FUNC fun;
	memcpy(&fun,&xaddr,sizeof(FUNC));
	fun();
	getchar();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值