关于this指针的深入探讨

逸学堂 2006-01-24 09:59:12
任何一个对象都是指向自身的this指针.我想深入了解一下this指针.

1:this指针是什么时候创建的?
构造对象前,构造对象后,还是其他?
2:this指针存放在何处?
堆,栈,全局变量,还是其他?
3:this指针如何传递给类中函数的?
绑定?还是在函数参数的首参数就是this指针.那么
this指针又是如何找到类实例后函数的?
4:this指针如何访问类中变量的/?
5:我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的
位置可以直接使用吗?
6:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?
7:这些编译器如何做到的?
8:能否模拟实现?
...全文
3029 137 打赏 收藏 转发到动态 举报
写回复
用AI写文章
137 条回复
切换为时间正序
请发表友善的回复…
发表回复
citywanderer2005 2006-03-08
  • 打赏
  • 举报
回复
mark
iambic 2006-02-21
  • 打赏
  • 举报
回复
this是作为成员函数的参数传递进来的。那些内联函数应该也是编译时候就解决掉的吧。
zyyoung 2006-02-21
  • 打赏
  • 举报
回复
关注
adingzhang 2006-02-19
  • 打赏
  • 举报
回复
MARK
shot411 2006-02-19
  • 打赏
  • 举报
回复
mark
danny 2006-02-13
  • 打赏
  • 举报
回复
忍不住MARK下来..
sjjf 2006-02-13
  • 打赏
  • 举报
回复
#include "stdafx.h"

class parentA
{
public :
int iA;
virtual void fa();
};

class A:public parentA
{
public :

int i1;
int i2;

void fa();

};

void parentA::fa()
{
printf("\n parentA iA =[%d] \n",this->iA);
}

void A::fa()
{
printf("\n i1 =[%d],i2=[%d] \n",this->i1,this->i2);
}

void foo1()
{
A a;
a.i1 = 1;
a.i2 = 2;
a.fa();
}

void foo2()
{
A a;
parentA pa;

printf("A老爸的虚函数表的地址:[%d] ",*((unsigned int *)(&pa)));
printf("A虚函数表的地址:[%d] ",*((unsigned int *)(&a)));

int t1[4] ;
t1[1] = 3;
t1[2] = 4;
t1[3] = 5;
((A *)&t1)->A::A();
((parentA *)&t1)->fa();

printf("模拟-- A的虚函数表的地址:[%d]",t1[0]);


((parentA *)&t1)->parentA::parentA();
((parentA *)&t1)->fa();


printf("模拟-- A老爸的虚函数表的地址:[%d]",t1[0]);

//获取虚函数表的地址还可以实例化一个有虚函数的类,然后将这个类的首地质拷贝出来。

}
int main(int argc, char* argv[])
{
foo1();
foo2();
return 0;
}
//只是为了模拟,所以不要指着这样的代码没有任何的用处。尽管实际上没有谁会这么用它。
//但是知道两条通向罗马的道路总比一条好。
sjjf 2006-02-13
  • 打赏
  • 举报
回复
//下面的代码运用了数组解释了多态的运行机制,
//推而广之,这种方法能够获取类的虚函数表(如果它存在的话)。
//这个想法来源于很久以前,群里 "生命的颜色"和"ablue"的讨论stl模板的某一个实现中
//参数传入 A::A() 的情况。当时我们都误以为是创建了一个对象,
//在后来,偶学习cpp在vc中的实现时才发现构造函数的实现原理。
//今天忽然想起了这件事,记之。

#include "stdafx.h"

class parentA
{
public :
int iA;
virtual void fa();
};

class A:public parentA
{
public :

int i1;
int i2;

void fa();

};

void parentA::fa()
{
printf("\n parentA iA =[%d] \n",this->iA);
}

void A::fa()
{
printf("\n i1 =[%d],i2=[%d] \n",this->i1,this->i2);
}

void foo1()
{
A a;
a.i1 = 1;
a.i2 = 2;
a.fa();
}

void foo2()
{
int t1[4] ;

t1[1] = 3;
t1[2] = 4;
t1[3] = 5;
((A *)&t1)->A::A();
((parentA *)&t1)->fa();

((parentA *)&t1)->parentA::parentA();
((parentA *)&t1)->fa();

}
int main(int argc, char* argv[])
{
foo1();
foo2();
return 0;
}
guanyouwen 2006-02-10
  • 打赏
  • 举报
回复
向各位高手学习。。。
jerdy2000 2006-02-10
  • 打赏
  • 举报
回复
mark
alen_ghl 2006-02-08
  • 打赏
  • 举报
回复
this在构造函数里定义并赋值的

const类型可以先定义,然后再赋值?
StealDream 2006-02-07
  • 打赏
  • 举报
回复
3:this指针如何传递给类中函数的?
虽然我们可以显示的使用 this 访问方法,但我想编译器此时并不会使用 this 所表示的地址去计算方法的地址,this 应该只是用来访问类数据成员的,而方法的地址在程序一起动就以经静态固定在代码段,程序只是根据类的类型在代码段中去查讯出方法的地址然后再根据 this 访问要使用的数据成员。

4:this指针如何访问类中变量的/?
this 指针是类内部使用的,好像是是在程序设计期间使用的要访问数据的一个相对起始位置,在程序运行期间,this的值应该与类对像名的值一样

6:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?
问得好!
nale 2006-02-07
  • 打赏
  • 举报
回复
mark
gogowhy 2006-02-07
  • 打赏
  • 举报
回复
m
sjjf 2006-02-06
  • 打赏
  • 举报
回复
------------------------
4 尾声: 编译原理和编译器如何产生代码没什么关系....
------------------------
btw: 到哪儿去找 编译器如何产生代码 的资料?
sjjf 2006-02-06
  • 打赏
  • 举报
回复
学习ing,
我虽然知道debug产生的代码比release得多,但是一直不知道release 模式和debug模式的区别在哪儿。
有空学习后再请教。
vc_hunter 2006-02-06
  • 打赏
  • 举报
回复
看了一些上面人的回答,不尽全对,我的答案因该可以

1:this指针是什么时候创建的?
this指针只是对象的起始地址,当然是对象创建后
2:this指针存放在何处?
根据对象创建的位置,全局的对象就是堆,函数里(包括main)里创建的就是栈
3:this指针如何传递给类中函数的?
vc6里通过ecx传递,参数用栈传递,进入函数后,通过ecx得到对象的首地址,然后再操作内部的数据,函数的找地址跟this无关,编译器自己会找
4:this指针如何访问类中变量的/?
如上题,this就是对象的地址,this+偏移量就是变量的地址
5:我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的
位置可以直接使用吗?
所谓this指针是指在对象内部称呼自己的地址为this,在对象外部是不应该叫this...对象的地址直接操作当然没问题。。
6:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?
非虚函数没有函数表,虚函数通过vptr指向一个vtable,里面都是虚函数地址
7:这些编译器如何做到的?
。。。。。。。。。。看深度探索C++对象模型
8:能否模拟实现?
。。。。。。。。。。部分可以,需要了解一些知识,比如汇编
ox_thedarkness 2006-02-06
  • 打赏
  • 举报
回复
厄... 更正一下, this是否保存取决于编译器对函数的分析
如果他认为函数太复杂,也会在栈上保存this。
——但是这个栈上的this并非固有的,而是函数临时决定的:1 不一定存在。 2 偏移不固定。

ox_thedarkness 2006-02-06
  • 打赏
  • 举报
回复
- - 不知道,根据汇编还有大家的只字片语猜吧。。。也能猜得和真相八九不离十。。。
ox_thedarkness 2006-02-05
  • 打赏
  • 举报
回复
to sjjf(水晶剑锋) : 你可以看看release模式下的asm代码,并不会保存this。
加载更多回复(116)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧