指针类型学习总结-- this指针

来源:互联网 发布:淘宝新店推广 编辑:程序博客网 时间:2024/05/01 02:56

December 5, 2015 3:39 PM

1.基本介绍

在指针的世界里有一个特殊的指针–this指针,this指针代表的是当前的对象。在c++里,类的成员函数属于类,而一个对象的数据成员属于对象自己,也就是说,成员函数是所有对象共有的,只有一份,而对象是有多份的。这样,我们在调用成员函数的时候为了让成员函数知道是哪个对象在调用,或者说,成员函数将要处理哪个对象的数据,需要一个指针传递给当前对象地址。那么,直接在调用时候把对象地址给成员函数不就可以了?那太麻烦了,所以this指针这个时候就派上用场了。当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
例如:

student.display();

相当于:
display(&student);
this指针以隐含的方式传递给了成员函数。

2.使用方法

this指针显式调用主要是为了消除二义性

Student::Student(int age){    this->age = age;}

此处如果没有this指针,代码存在二义性,有了this指针,编译器就知道是将形参传递给对象的数据成员。

3.重点难点

this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以通过&this获得),也可以直接使用它。

这里要注意的是虚函数的this指针和普通成员函数的this指针稍有不同,普通成员函数仅仅传递this指针,但是虚函数同时还需要根据this指针去访问vptr(虚函数表指针),选择相应的成员函数地址。

实现虚函数需要对象附带一些额外信息,以使对象在运行时可以确定该调用哪个虚函数。对大多数编译器来说,这个额外信息的具体形式是一个称为vptr(虚函数表指针)的指针。vptr指向的是一个称为vtbl(虚函数表)的函数指针数组。每个有虚函数的类都附带有一个vtbl。当对一个对象的某个虚函数进行请求调用时,实际被调用的函数是根据指向vtbl的vptr在vtbl里找到相应的函数指针来确定的。 这意味着可以通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。

2 0
原创粉丝点击