标签:下载次数 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
标签:下载次数 private public return amount
原文地址:http://11302692.blog.51cto.com/11292692/1755274