this 指针是一个隐含指针。系统要设计this指针是因为“类”这个数据和函数的集合类型,变化太多,类的成员函数在内存里只有一份,每个成员函数都有一个隐含的this指针,因为一个类可以定义无数多的对象实例,内存内不同的只是每个对象的属性值,也就是说每个对象的成员变量的值不同而已,成员函数不占用类定义的对象的存储空间;无论哪个对象实例调用成员函数,实例就把自己的首地址传给该成员函数的this指针。这时候的this指针,它就相当于段地址,系统知道,它指向哪个成员变量时的偏移量。指向元素时是段地址和偏移地址的和;
例如定义了一个类Cdog
class Cdog //定义一个dog类;
{
public:
int iAge; //年龄
int iWeight; //重量
int get_age()
{
return iAge;//对于每一个实例,指针的值是不同的;
}
};
其中有一个成员函数 int get_age;取得年龄的数值;
在主程序中调用成员函数:
int _tmain(int argc, _TCHAR* argv[])
{
Cdog dog1,dog2;
dog1.iAge=5;
int age;
age=dog1.get_age();
cout<<"the age is :"<<age<<endl;
return 0;
}
第6行 age = dog1.get_age();调用成员函数int get_age(),此时成员函数内部隐含的this指针指向了dog1这个实例的首地址因为iAge是对象的第一个成员变量,所以这时候不用偏移;如果要对iWeight操作,系统会加上一个int的偏移地址,不同的系统int的字节数不同;
其实在程序的第3行,用类名Cdog定义实例dog1和dog2的时候,编译器已经给实例dog1分配了内存,这个内存的首地址,编译器是知道的;在第6行age = dog1.get_age(); dog1对象调用成员函数get_age()时,编译程序先将实例dog1的地址赋给 this 指针,在this指针的指引下访问dog1实例的age元素,获得它的值,然后又通过return age传出;每次成员函数存取数据成员的值时,隐含使用 this 指针。最大的原因是,类内各个元素占用的内存空间不一样,
系统没法为程序员提供一个指针用来指向各个元素,防止程序员用指针++或者指针+=操作指针;
所以,系统用this指针后加元素的方式来引用元素;
this 指针被隐含地声明为: ClassName const this,这意味着不能给 this 指针直接赋值;
其实在指针指向元素的时候,指针的值就被系统自动的改变了,相当于给指针赋值操作;
由于 this 并不是一个普通变量,是系统隐含提供给程序员使用的。所以,不能取得 this 的地址。