C++ 指针的引用问题
int a = 0;
int &b = a ;
if( &b == &a ) cout << "==";
else cout << " != ";
众所周知 , 这里的输出结果是== ;
然后我又改了一下
const int a = 0;
const int &b = a ;
if( &b == &a ) cout << "==";
else cout << " != ";
这里的输出结果竟然是!=了 , 我开始不明白了 , 然后我又改了一下
const int* a = 0;
const int* &b = a ;
if( &b == &a ) cout << "==";
else cout << " != ";
这里的输出结果又变回==了 , 我算是彻底糊涂了 , 接着我继续改
int* const a = 0;
int* const &b = a ;
if( &b == &a ) cout << "==";
else cout << " != ";
好吧 , 这里又变成!=了......大神快来给我解释一下吧!!!
......
至于为什么要搞这个实验呢 . 主要是因为我无法用&this来求this指针的地址 , 我便打算给它弄个引用 , 再求引用的地址 , 这样一来 , 引用也信不过了 , 我也彻底糊涂了 , 大家快给我详解一下 , 顺便也告诉我 , 基类的this指针和派生类的this指针究竟是不是同一个指针 ? 还是只是指向相同的两个指针 ? 小弟拜服.. 展开
引用的地址就是被引用变量的地址。你把!=的情况直接输出地址看看,我这里全等,应该是编译器不同吧。
至于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>
using namespace std;
class A
{
public:
void showthis()
{
cout<<this<<endl;
}
};
int main()
{
A a;
cout<<&a<<endl;
a.showthis(); //就是&a
return 0;
}
L-value的意思是可被寻址的对象(就是常说的左值),也就是说能用某个内存地址的数值来引用的对象。而this不存在于任何内存地址空间,所以&this是不可行的,代码调用中出现this,就用对象的地址取代它,就像宏替换一样
那不是this的地址,实际上other是个指针了,但使用了引用的语法,你可以这样试试
A*const& other=this;
A*const& other1=this;
cout<<&other<<endl;
cout<<&other1<<endl;
你会发现输出不一样,引用的内部实现还真不好说