码迷,mamicode.com
首页 > 编程语言 > 详细

C++ - this指针

时间:2016-03-26 08:24:44      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:下载次数   private   public   return   amount   

class CGoods

{

public:

void Regidter( char *m,int a,float p );

private:

char mName[NAME_LEN];

int amount;

float price;

};


void CGoods::Regidter( char *m,int a,float p )

{

strcpy(mName,m);

amount = a;

price = p;

}


int main()

{

CGoods good1;

good1.Regidter("huanggua",10,2.8);


return 0;

}


this指针

    如上一个简单的C++代码,在main函数用CGoods类定义了一个对象good1,通过调用成员方法Regidter对对象good1进行初始化,与C语言不同的是,C++中调用成员方法时,表面上并没有将成员对象作为参数进行传递,编译器“知道”初始化的对象是good1,这主要归功于C++的this指针。

    事实上,this指针是类的一个自动生成,自动隐藏的私有成员,它存在于类的非静态成员函数中,当一个对象被创建时,this指针就自动指向对象数据的首地址。在本例中,good1.Regidter("huanggua",10,2.8);在编译阶段可以想象被编译为CGoods::Regidter(&good1,char *m,int a,float p )。因此,从汇编方面讲,调用成员方法的C语言和C++操作没有本质区别。

函数调用时对this指针的处理

amount = a;

012E1513  mov         eax,dword ptr [this] 

012E1516  mov         ecx,dword ptr [a] 

012E1519  mov         dword ptr [eax+14h],ecx 

    以amount = a为例,通过反汇编代码进行分析,对amount = a的处理是这样的:先将this值赋给eax寄存器(this中存放的是good1的首地址),接着将a的值赋给寄存器ecx,最后将ecx的值赋给dword ptr [eax+14h],也就是this->amount(this[20])。由此可见,在调用成员方法时,任何涉及成员变量的语句,底层都有一个this指针在维护着。



本文出自 “11292692” 博客,请务必保留此出处http://11302692.blog.51cto.com/11292692/1755274

C++ - this指针

标签:下载次数   private   public   return   amount   

原文地址:http://11302692.blog.51cto.com/11292692/1755274

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!