C++ - this指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ - this指针相关的知识,希望对你有一定的参考价值。

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指针的主要内容,如果未能解决你的问题,请参考以下文章

C++ this 指针

C++ CreateThread函数如何传递this指针作为参数

c++和c#中'this'指针的概念和数据类型

C++ this指针

C++中的this指针是啥意思?

C++ 类设计总结回顾------this指针