C++ 指针的引用问题

在学习继承的时候,我们知道基类的this指针和派生类的this指针都是指向同一个内存地址,一开始的时候,我以为他们是同一个this指针,但是后来发现他们虽然指向相同,但是... 在学习继承的时候 , 我们知道基类的this指针和派生类的this指针都是指向同一个内存地址 , 一开始的时候 , 我以为他们是同一个this指针 , 但是后来发现他们虽然指向相同 , 但是类型不同 , 接着我想 , 他们到底是不是同一个this指针? 于是 , 我试图分别在基类和派生类的构造函数里写上 " cout << &this << endl ;" 但是报错了 , 理由是&运算符需要一个L - value , 后来我上网查了下 , L-value大概是指可被赋值的变量吧( 起码我是这样理解的 ) , 然后我想 , 难道常量就不可以求地址 ? 不可能~~ 于是我便展开如下实验 , 又发现了一个新问题 :
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指针究竟是不是同一个指针 ? 还是只是指向相同的两个指针 ? 小弟拜服..
展开
 我来答
CodeBlove
2014-04-13 · TA获得超过3364个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:244万
展开全部

引用的地址就是被引用变量的地址。你把!=的情况直接输出地址看看,我这里全等,应该是编译器不同吧。

 

至于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寄存器的值是一样的,该值就是对象地址,调试器已做了偏移量计算。

lsslddd
2014-04-13 · TA获得超过936个赞
知道小有建树答主
回答量:374
采纳率:0%
帮助的人:423万
展开全部

不知道你用的是什么编译器,我在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,就用对象的地址取代它,就像宏替换一样

追问

我用的是VC++6.0啊......刚才我在VS2008上试了一下 , 的确全是==啊, 难道是VC++6.0出错了?

接着我又试了这样的东西

然后发现的确输出了一个地址 , 难道这个地址不是this指针的内存地址吗?

追答

那不是this的地址,实际上other是个指针了,但使用了引用的语法,你可以这样试试

A*const& other=this;
A*const& other1=this;
cout<<&other<<endl;
cout<<&other1<<endl;

你会发现输出不一样,引用的内部实现还真不好说

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
束燕桦K3
2014-04-13
知道答主
回答量:7
采纳率:0%
帮助的人:9482
展开全部
不太清楚啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式