引用的地址就是被引用变量的地址。你把!=的情况直接输出地址看看,我这里全等,应该是编译器不同吧。
至于this,是个特殊的指针,一般我们自己定义的指针会分配一个内存空间,比如32位的地址会分配4字节的指针变量空间。然后指针赋值时,将某变量或对象的地址存入。但是this是编译器确定的常量地址,this指向对象地址,它本身是对象内部的相对偏移量,当然没有地址,所以无法引用。
一般基类指针和派生类指针不一样,而当一个派生类创继承的是虚基类,此时是一样的。
下面看看this到底是个什么东西,调试时查看反汇编,见附图:
函数返回this时,找到this指向的地址,取出后返回。
进入函数时,将CPU的基地址寄存器(ebp)入栈,也就是对象地址,初始化参数后。
第一行指令pop,弹栈到寄存器ecx
第二行是将ecx寄存器存入ebp-8的地址中,也就是在对象地址上面8个字节开始存放对象地址。
第三行根据this指针取得对象地址,存入寄存器eax。
注意这行的指令代码(8B 45 F8)最后一个字节,F8的十进制是-8,显然就是偏移量,是基地址的偏移量,所以this指向的就是ebp-8.而ebp-8的地址中正是第二行存入的基地址(对象地址)。
后面就是返回eax,观察监视窗口,this和ecx寄存器的值是一样的,该值就是对象地址,调试器已做了偏移量计算。
不知道你用的是什么编译器,我在vc2013 做你上面的引用测试结果输出全是"=="
还有,this指针是对象的,而不是类的,不是同一个对象,那this指针自然也不同
给你个例子:
#include <iostream> L-value的意思是可被寻址的对象(就是常说的左值),也就是说能用某个内存地址的数值来引用的对象。而this不存在于任何内存地址空间,所以&this是不可行的,代码调用中出现this,就用对象的地址取代它,就像宏替换一样
我用的是VC++6.0啊......刚才我在VS2008上试了一下 , 的确全是==啊, 难道是VC++6.0出错了?
接着我又试了这样的东西
然后发现的确输出了一个地址 , 难道这个地址不是this指针的内存地址吗?
那不是this的地址,实际上other是个指针了,但使用了引用的语法,你可以这样试试
A*const& other=this;你会发现输出不一样,引用的内部实现还真不好说
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。