this关键字
在C++语言中,我们都知道this关键字,它代表对象本身。这次想通过下面的代码,来简单说明下this关键字的作用和机理。
#include <iostream> using namespace std; class CNullPointer { public: static void Test1(); public: void Test2(); void Test3(int a); void Test4(); private: static int mStatic; private: int mTest; }; int CNullPointer::mStatic = 4; void CNullPointer::Test1() { cout << mStatic << endl; } void CNullPointer::Test2() { cout << "OK" << endl; } void CNullPointer::Test3(int a) { cout << a << endl; } void CNullPointer::Test4() { cout << mTest <<endl; } int main() { CNullPointer *obj = 0; obj->Test1(); obj->Test2(); obj->Test3(3); //obj->Test4(); return 0; }
上面的程序编译,能顺利运行。可能有些人不明白,为什么对象没有生成,却可以调用成员函数。
其实在C++程序中,利用对象指针调用类的程序函数时,隐含向成员函数传递this这个参数,但这个this参数和一般的参数不同,除了一些细节方面不同外,this与其他参数的存储地址不同,如一般的参数都被压入栈中,函数返回时从栈中弹出来,而this指针被存放到ecx这个寄存器中保存起来。下面针对每个成员函数,分别进行说明:
obj->Test1();
由于Test是一个静态函数,而且其函数内操作的变量也是类变量,所以不属于任何对象,是一个类方法。所以在调用这个函数的时候没有this的概念。因而也不需要计较this是否为0。
obj->Test2();
这是一个成员函数,在调用时需要传递this这个指针,但由于函数内不需要使用this,所以也不需要计较this是否为0。
obj->Test3(3);
这也是一个成员函数,在调用时需要传递this这个指针,但由于函数内也不需要使用this,所以也不需要计较this是否为0。
所以,以上这三个函数在调用的时候都可以成功运行。如果把obj->Test4();的注释去掉。则程序在运行到该行代码时,因为this指针为0,而导致程序崩溃。
下面通过程序运行时的反汇编代码,来了解代码在运行时的细节:
1 45: CNullPointer *obj = 0;
2 00401738 mov dword ptr [ebp-4],0
3 46: obj->Test1();
4 0040173F call @ILT+110(CNullPointer::Test1) (00401073)
5 47:
6 48: obj->Test2();
7 00401744 mov ecx,dword ptr [ebp-4]
8 00401747 call @ILT+555(CNullPointer::Test2) (00401230)
9 49: obj->Test3(3);
10 0040174C push 3
11 0040174E mov ecx,dword ptr [ebp-4]
12 00401751 call @ILT+45(CNullPointer::Test3) (00401032)
13 50: obj->Test4();
14 00401756 mov ecx,dword ptr [ebp-4]
15 00401759 call @ILT+355(CNullPointer::Test4) (00401168)
16 51:
17 52: return 0;
18 0040175E xor eax,eax
从以上的反汇编代码可以看出,dword ptr [ebp-4]为this对象存放的地方。程序开始时,被设置为0。
当运行到obj->Test1()的时候,由于不需要传递this指针,所以没有用到dword ptr [ebp-4]。
当运行到obj->Test2()的时候,传递了this指针,使用了dword ptr [ebp-4]。
当运行到obj->Test3()的时候,传递了this指针和参数,也使用了dword ptr [ebp-4]。但普通参数和this参数存放的地方不同,普通参数被压入栈中,而this指针被存放到寄存器变量ecx中。
当运行到obj->Test4()的时候,传递了this指针。
以上就是有关自己对this指针的理解。
posted on 2011-01-19 21:46 ActiveChange 阅读(247) 评论(1) 编辑 收藏 举报