浅谈C++中的this指针

来源:互联网 发布:淘宝上拍卖的房子 编辑:程序博客网 时间:2024/06/06 16:35

this指针的引出

每个对象中的数据成员都分别占有存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间以存放n个对象中的数据成员。每个成员函数都有个特殊的指针——this指针。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。

this指针的特性

1.this指针是隐式使用的,它是作为参数被传递给成员函数的。
2.this指针的类型 类类型* const。
3.this指针并不是对象本身的一部分,不影响sizeof的结果。
4.this的作用域在类成员函数的内部。
5.、this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。
6.、只有在类的非静态成员函数中才可以使用this指针, 其它任何函数都不可以。

_thiscall调用约定

a、__thiscall只能够用在类的成员函数上,参数从右向左压栈。
b、如果参数个数确定,this指针通过ecx传递给被调用者;如果参数不确定,this指针在所有参数被压栈后压入堆栈。
c、对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈。

this指针测试##

this指针是存在与类的成员函数中,指向被调用函数所在的类实例的地址。根据以下程序来说明this指针:

include<iostream.h>class Point{   int x, y;public:  Point(int a, int b) { x=a; y=b;}  Void MovePoint( int a, int b){ x+=a; y+=b;}  Void print(){ cout<<"x="<<x<<"y="<<y<<endl;}};void main( ){   Point point1( 10,10);   point1.MovePoint(2,2);   point1.print( );}

当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。
MovePoint函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:
void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}
即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。
即该函数过程可写成 point1.x+= a; point1. y + = b;

总结

this指针最大的作用就是它保存了当前对象的地址,并且应用指针的形式指向了当前的对象。

1 0
原创粉丝点击