本文共 1692 字,大约阅读时间需要 5 分钟。
C++中的this指针
在C++中指针this有着极其重要的作用,但却又把自己隐藏起来,默默付出的存在,不显山,不露水,深藏功与名。在C++的类中实际上到处都有this的身影(实际上在现在的编程语言中不乏类似的存在,例如:Python中的self),从成员变量到成员函数到参数列表(是的,连参数列表中它都存在,只是它在这里是以隐藏参数的身份存在的),每一个角落它都存在,而且都发挥着重要的作用。
this指针是什么?它是一种特殊的指针,指向的是对象本身。知道了基本的定义后,接下来让我们一层层的去剥开它那厚厚的面纱,更深入的了解它的本真。
首先我们来看一个this指针的简单应用,假设在某个类A中的某个成员函数F(),该函数的形参和类A的成员变量同名:
class A{ int aa; void F(int aa){ this->aa=aa; }}
在这里使用的this->aa=aa;就能够很好的分别出是类A中的aa还是成员函数中的aa。其实类似的我们还可以使用域运算符 :: 。
其次我们将目光聚集在类的成员函数上,看起来一切都很普通的样子,没什么特别的。但有一点是表现的相对较为特别的,如果你了解对象的数据存储结构的话,你应该能够
注意到一点。在类实例化的过程中,每个对象都会实例化出自己的成员变量,但成员函数并不会。对象在内存空间中是分区域存储的,包括一下五个存储区域:堆区(主要存放函
数参数,局部变量的值)、栈区(主要储存由程序员自己申请的数据)、全局区(储存全局变量和静态变量)、文字常量区(储存常量字符串)、二进制代码区(储存函数的二进
制代码)。由同一个类实例化的所有对象共用相同的二进制代码区,简单来说就是代码只有一份,但对象有多份,每个对象调用成员函数却能操纵自己的数据成员,这就是this的
功劳啦。在成员函数的函数头的参数列表中,this指针作为隐藏参数存在:
class A{ int a; void F(A* this, int aa){ this->a=aa; } //注意,这里多了参数: A* this}
其实每一个成员函数都是被this指针指向的,我们不需要是因为编译器统一处理了,也就是对我们隐藏了。
接着还有一个常用方式是我们常用的,在对象调用成员方法的时候,有时候我们会连续调用,能够连续调用是因为上一次调用返回的是当前对象本身的引用:
class A{ int a; A& F(A* this, int aa){ this->a=aa; return *this; } //注意,这里改变了函数的返回值 // A F(A* this, int aa){ this->a=aa; return *this; } //注意本段代码与上段代码的区别}
最后还有一种情况下,也有this指针的身影,常成员函数: func()const
class A{ int a; const A& F(int aa){ a=aa; return *this; } const A& F(int aa)const{ a=aa; return *this; } //此处实际的代码应该是: // A& F(const A* this, int aa){ this->a=aa; return *this; } }
我们知道常成员函数是不能改变成员变量的值的,其实本真就是因为对类成员的赋值操作是需要借由this指针来实现的,此时指this针指是一个常指针。还有一点要指出的是const A& F(int aa){ a=aa;return *this; }和const A& F(int aa)const{ a=aa; return *this; }这两个函数是互为重载的,因为它们的参数列表实际上是不同的,虽然看起来好像一样,但编译器编译后就不一样了。 但在使用的时候需要注意的是只有常对象才能调用常成员函数,因为只有这时this指针才指向了一个常对象,和参数列表相匹配。
转载地址:http://ommsi.baihongyu.com/