深入探讨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;
}