如
class a{
public:
void show(){
cout<<&this;
}
}
如果this是一个指针,为什么不能访问它的地址?
首先要搞清楚this指针是存放在哪的?编译器在生成程序时加入了获取对象首地址的相关代码,并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同),也就是成员函数的其它参数正常都是存放在栈中,而this指针参数则是存放在寄存器中。
寄存器不能像被外设寄存器或存储器一样被访问到,它不在你的寻址范围中,必须使用特定的汇编指令才能访问。
这个问题真的首先要搞搞清楚什么是this,还要有点从编译程序原理的角度看问题的方法。下面内容引用博客:
#面向对像的C语言
##C++的this指针
在C++编译器的实现中,因为有类的存在而且为了方便引用类本身的成员,编译器引入了一个为每个类进行自动化管理的一个地址,在C++代码中使用到它时,就把this关键字替换成类实例的地址值。所以static成员是不能使用this指针的,因为对于static成员,类实列还未出生呢!
为了说明this指针,用以下一段小程序来演示:
class Base
{
public:
void say(){ printf("Hi! %d", this); }
};
int main()
{
Base bb;
bb.say();
return 0;
}
在使用this指针的时候很容易就把它当成一般的指针变量来使用了,但这是行不通过,在编译器看来它不是个变量,对于每个类实列,它就是一个地址值。就是一个数值,也就是所谓的左值 lvalue,所以不能给它赋值。
总结一够话就是:this指令是不能访问的,但可以使用它。
this是一个指针,但他不是指针变量。因此你不能取他的地址。