2 s121005 s121005 于 2016.03.05 09:02 提问

C++中 不能在类中访问this的地址


class a{
public:
void show(){
cout<<&this;
}
}
如果this是一个指针,为什么不能访问它的地址?

4个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.05 09:45
已采纳

首先要搞清楚this指针是存放在哪的?编译器在生成程序时加入了获取对象首地址的相关代码,并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同),也就是成员函数的其它参数正常都是存放在栈中,而this指针参数则是存放在寄存器中。
寄存器不能像被外设寄存器或存储器一样被访问到,它不在你的寻址范围中,必须使用特定的汇编指令才能访问。

zuishikonghuan
zuishikonghuan   2016.03.06 08:18

this是一个指针,但他不是指针变量。因此你不能取他的地址。

WinsenJiansbomber
WinsenJiansbomber   2016.03.05 11:28

这个问题真的首先要搞搞清楚什么是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,所以不能给它赋值。

WinsenJiansbomber
WinsenJiansbomber   2016.03.05 11:29

总结一够话就是:this指令是不能访问的,但可以使用它。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!