博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中的this指针
阅读量:4111 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
树、二叉树、森林之间的转化
查看>>
堆排序
查看>>
二叉排序树 平衡二叉树
查看>>
创建索引
查看>>
new与delete
查看>>
线索二叉树
查看>>
外部排序 归并排序
查看>>
POJ 3255 Roadblocks 最短路Dijkstra+堆优化
查看>>
poj 3723 最大生成树
查看>>
poj 2139 Six Degrees of Cowvin Bacon 最短路bellman 多源最短路径 (一次AC)
查看>>
Codeforces Round #329 (Div. 2) A. 2Char 字符串+暴力
查看>>
poj 3259 Wormholes 最短路bellman 题意转化很重要
查看>>
poj 2456 Aggressive cows 整数二分写法 模板题
查看>>
poj 3104 Drying 二分搜索--查找最小yes值
查看>>
poj 3111 K Best 二分搜索 最大化平均值
查看>>
POj 3258 River Hopscotch 二分搜索 最大化最小值
查看>>
poj 2674 Linear world 弹性碰撞 升级的蚂蚁
查看>>
poj 2785 4 Values whose Sum is 0
查看>>
Codeforces Round #324 (Div. 2) A. Olesya and Rodion 构造数字 思维题
查看>>
Codeforces Round #324 (Div. 2) B. Kolya and Tanya 思维题 数论
查看>>