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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
为什么Java中类方法不能访问实例方法
我们已经知道类体中的方法分为实例方法和类方法两种,用static修饰的是类方法。二者有什么区别呢?当一个类创建了一个对象后,这个对象就可以调用该类的方法。 当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,
如何定义一个只能在堆上(栈上)生成对象的类
来源: https://www.nowcoder.com/questionTerminal/0a584aa13f804f3ea72b442a065a7618 简要描述 1、只能在堆上生成对象:将析构函数设置为私有。 原因:C++是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象。
不能在成员函数xxx的类外部重新声明该函数
错误 2 error C2601: “CHIKIPCamera::SetPtzParam”: 本地函数定义是非法的 d:\work\project\mediaclient\code\mediaclient\ctsrtsp\hikipcamera.cpp 98 1 CTSRtsp 错误 3 error C2601: “CHIKIPCamera::GetParam”: 本地函数定义是非法的 d:\w
【c++】为什么类中静态(static)成员不能在类的定义内初始化?
先看一段代码:
如何创建一个只能在堆上产生对象的类
题目:如何创建一个只能在堆上产生对象的类一、分析: 1.定义一个只能在堆上产生对象的类,自然联想到new、malloc、calloc等动态分配内存的方法来产生对象。但在C++中,产生对象要调用构造函数,当然选择new来解决。 2.只能在堆上而不能在栈上创建对象,想到可以把构造函数定义成private或者protected 里面,防止在类外的栈空间上调用构造函数来创建对象。 3.可以定义一个成员
不能在成员函数 的类外部重新声明该函数
VS2012错误:不能在成员函数  的类外部重新声明该函数 解决:检查函数的大括号匹配
为什么static成员必须在类外初始化,而不能在类的头文件中初始化
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样。 class A { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字 为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包
关于java中的protected访问权限
1. protected 访问控制符能被用于方法和成员变量。     2. 声明为protected的方法和成员变量能被同一个包里的所有类所访问,就像默认修饰符package一样。     3. 能被该类的子类所访问,子类可以和父类不在一个包中。     这样,当你想让一个类中的某个方法或成员变量在包中都可见,而且其子类也能访问(子类有可能和父类不在同一个包中)但又不想让所有类都可以访
C语言中static 函数除了不能再外部被调用外和普通函数还有什么区别呢?
C程序一直由下列部分组成:       1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;      2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。      3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。       4)栈——增长方向:自顶向下增长;自动变量以
静态构造函数 。。静态类中成员必须全是静态的。不能在静态类中声明实例成员
静态类是不能被实例化的。调用静态类的成员(方法,变量,属性)的时候用  静态类名.成员名  的方式来调用   静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。即:静态运行时被加载一次。 非静态每次运行都被加载 非静态类需要你自己去实例化加载它,才能调用   调用静态类成员的时候,会首先调用静态的构造函数去初始化这个静态成