java的this指针
① 一个c++虚函数与this指针的问题
1.
不可以。
2.
是。
3.
是。
你这个疑问就实际上涉及到了编译技术。this指针你会发现他是C++的关键字,而不是在那个头文件里声明的变量。也就是说,this指针并不是一个真实存在的C++语言变量,“父类指针不能自动(隐式)转换为子类指针”实际上是C++语言的变量类型规则,但this指针并非一个变量,所以不需要遵循此规则。从执行中的程序来说,this指针是帮助函数确定对象的位置。
如果非要问,this指针到底是储存在哪里?你去看网络,它是这样说的“不存在所谓的this的“位置”,只是this表示了对象的存储位置而已。&this违反语义规则,是错误的用法,不会编译通过。”当然,这是从C++语言的层面上来谈。在程序运行中,其实确实是有一个地方储存this指针的值的,不过这只有在非静态函数被调用才存在的。在X86处理器中,储存这个值的地方是寄存器ecx,X86-64储存这个值的地方是rcx。下面给出例子。
void G(IA* a)
{
a->F();
}这段对应的汇编语言重点如下:
mov
rcx,
[rsp+28h+arg_0]
<——这里就是把对象的首地址(就是变量a的值)放在rcx中。
call
qword
ptr
[rax]
<——调用F()函数。
virtual void F()
{
this->member++;
}mov
[rsp+arg_0],
rcx
<——将rcx(其实就是所谓this指针)压进栈以防rcx寄存器有他用。
mov
rax,
[rsp+arg_0]
mov
eax,
[rax+0Ch]
<——通过this指针找到成员变量member的位置。
inc
eax
<——执行自增操作。
看到了吧,this指针不过就是类成员函数被调用时,被临时储存到rcx寄存器的对象首地址。
之所以啰嗦这么多,意思就是让你明白(如果你被上面所述搞得一头雾水),从程序实际运行的角度上看,this指针与其说是C++的指针,还不如说是编译技术里的东西,汇编/机器语言里根本没有类型一说(当然,机器最多分整数运行储存单元和浮点数运算储存单元),自然不存在什么类型转换了。