本文主要给读者介绍一下this指针,this指针是一种特殊的指针,理解this指针能更方便的开发程序,特别是在面向对象的可视化编程中,如MFC中会常常用到this指针,用好this指针能在程序开发中起到事半功倍的效果。
1.对象的存储机制
类实例化对象,同一类的对象的数据成员的值一般是不同的,但成员函数的操作是相同的,所以,类的所有对象有相同的成员函数入口,而不同对象的数据成员各自有各自的存储空间,也就是说对象所占的内存空间大小是由数据成员决定的。那么问题来了,既然公用的成员函数的入口地址相同,那么具体对象调用公用的成员函数的时候,函数怎么操作具体对象的数据成员,或者说,对象怎么把它自己的数据成员传递给公用的成员函数。
C++通过一种特殊的指针,this指针机制解决这个问题。
2.this指针
this指针指向当前的对象!一个类所有的对象调用的成员函数都是同一代码段。this指针是一个隐含于每一个成员函数中的特殊指针。它的值是当前调用这个公用成员函数的对象的地址,指向正在调用成员函数操作的对象,也就是操作成员函数的对象,在类的非静态成员函数中返回类对象本身的时候,直接使用return*this。例如,在对象pt调用成员函数时,成员函数如果有参数,除了接受实参外,还接受到了一个对象的地址。这个地址被一个隐含的形参this指针所获取,它等同于执行this=&pt。所有对数据成员的访问都隐含地被加上前缀this->。例如:x=0; 等价于 this->x=0。先看看下面的一个例子。
#include<iostream>
using namespace std;
class Sum
{
public:
int add();
int a;
int b;
int c;
};
int Sum::add()
{ return this->a +(*this).b+c; }
//分别用this指针、this去引用和直接三种方式访问类数据成员a, b,c
int main()
{
Sum t;
t.a = 1; t.b = 2; t.c = 3;
cout << t.add() << endl;
return 0;
}
上面显示的使用了this指针,通过上面的例子可以看出:this指针既可以被显示的使用,也可以被隐式的使用。隐式情况下,当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,成员函数存取数据成员时,由隐含的this指针指向对象,取出相应的数据成员。而大多数程序设计中,通常都是隐式地使用this指针来访问数据成员。这些都是由编译器隐式完成的,程序员一般不关心。显示情况下,可以通过this->a和 (*this).a访问数据成员a,同样也可以使用*this来标识该对象。
this只能在成员函数中使用。全局函数、静态函数都不能使用this。调用系统非静态函数时,系统把对象的地址赋给this指针,由于静态成员函数不属于某一个对象,所以它没有this指针,所以不能对静态成员函数进行默认访问。同样,类的静态成员函数也就无法调用类的非静态数据成员和成员函数。
小技巧:在面向对象的编程中,一般会给程序开发提供庞大的类库,一个类中可能会有许多数据成员,如果在成员函数中想调用类中的某个成员,可以使用VC++提供的自动列出成员函数功能,使用this->,VC++将列出该类中的所有成员,我们可以从列表中选择我们想调用的成员。这样可以提高编写速度,减少拼写错误。
参考文献:
http://blog.chinaunix.net/uid-21411227-id-1826942.html
http://vvsongsunny.iteye.com/blog/1136136