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编辑  收藏  举报

导航