深入浅出c++之---this指针
前言:C语言中的数组指针和指针数组
数组指针,是指向数组的指针的缩写;指针数组,是存放指针的数组的缩写。其实很多时候,往往因为简写和缩写带给我们很多困惑。我曾想过不用简称去学习,但在很多时候,我们查询的书籍文档和文章中还是会频频出现这样的简称,所以有必要扣一下字眼了。
int *p[];//[]优先级大于*,所以p是一个数组,数组中存放3个指向int的指针,这也就是指针数组。
int (*p1)[];//先看括号,p1是一个指针,指向一个数组,数组的类型为int,这也就是数组指针。
无论在《c和指针》还是《Effective C++》中,对于这样稍微复杂一点的表达式进行解释的时候,都告诉我们先从变量名开始读,然后看变量名紧跟的运算符的优先级,即可完成解读。那么这和this指针有什么关系呢?关系就在于简称。
引用c++ primer中文版第五版上的原话:常量指针(const pointer)!当我第一次读到这里的时候,就觉得怪怪的,常量指针到底是指向常量的指针还是指针本身是常量?(这一点尤为重要)很明显,根据英文const pointer显示作者想要表达的是这个指针是一个常量,也就是 T * const pointer,作为c语言的后续语言,我想在简称的时候也应该和c保持一致,const pointer简称为指针常量更好,T * const pointer 先找变量名pointer,往左读,const证明是常量,读完表达式,pointer指针是常量,简称指针常量更可取,为什么呢?
数组指针,强调了这是一个指针,指向数组;
指针数组,强调了这是一个数组,数组里面存的指针。
那么同理的话,常量指针,强调这是一个指针,指向常量;
指针常量,强调常量,表示这个指针是常量即const pointer。
当然这是我个人从c过度而来并根据《c和指针》&&《Effective C++》上的习惯,你也可以像书上一样的简称,只要你明白具体的意思。但是最好使用的简称能快速反应出具体事实。就此,我认为该书此处释义有待商榷。
说完前言,回到正题------this指针。
引用c++ primer上的例子:
struct Sales_data{
std::string isbn() const {return bookNo}
......
std::string bookNo;
};
isbn函数时如何获得bookNo成员所依赖的对象的呢?
例如我们定义一个:Sales_data total;
然后 total.isbn();当我们调用成员函数时,实际上是在替某个对象调用它。成员函数通过一个名为this的隐式参数来访问调用它的那个对象。当我们在isbn函数中返回bookNo的时候,其实隐式执行了this->bookNo, 即total.bookNo。this顾名思义,就是“这个”的意思,谁来调用成员函数,this就指向谁的指针。
total.isbn(); 编译器等价地认为:Sales_data:: isbn(&total);编译器负责把total的地址传递给isbn的隐式形参this。在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问符来做到这一点,因为this正是指向这个对象的。this形参是隐式的,任何自定义名为this的参数或者变量的行为都是非法的。因为this的目的总是指向“这个”对象, 所以this是一个常量指针 (这是书上原话,而经过我刚才的前言,这里改为指针常量更合适) 。 即,this是一个指针常量。这样理解后面的就轻松多了。
在上面的例子中,this的类型是Sales_data * const。尽管this是隐式的,但它也必须遵守初始化规则,默认情况下我们不能把this绑定到一个常量对象上。c++中的做法是把const关键字放在成员函数的参数列表之后,此时紧跟在参数列表后面的const表示this是一个指向常量的指针。这样的函数也叫常量成员函数。即加了const在参数列表之后,this此刻的类型为const Sales_data *const。
到这里,以后自己写成员函数的时候就不会那么模糊了,首先明确this是一个指针,它本身是个常量,要想把一个常量绑定给this,我们需要把这个this指针限定为常量指针(指向常量的指针)。那么,以后自己写成员函数时,就把它当做一个普通指针一样对待,那么,this将不再迷糊。不需要指向常量就不在参数列表后加const,需要就加上const。
NOTE:
即使bookNo定义在isbn之后,isbn还是可以使用bookNo,编译器分两步处理类,首先编译成员的声明,然后才轮到成员函数体(如果有的话)。因此,成员函数体可以随意使用类中的其他成员而无须在意成员出现的次序。
深入浅出c++之---this指针的更多相关文章
- C语言面试题分类->指针
有关指针的经典面试题 C语言为何如此长寿并实用?C++为什么有那么多精彩?指针可以说是C/C++中的灵魂所在,虽然早期中pascal也有指针,但是和C/C++比起来不是一个级别的.今天为大家深入浅出的 ...
- 【C++深入浅出】智能指针之auto_ptr学习
起: C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template& ...
- 深入浅出C指针
http://bbs.9ria.com/blog-164422-18039.html 初学者在学习C语言时,通常会遇到两个瓶颈,一个是“递归”,一个是“指针”.大学老师在讲述这两个知识点时通常都是照本 ...
- 深入浅出剖析C语言函数指针与回调函数(一)【转】
本文转载自:http://blog.csdn.net/morixinguan/article/details/65494239 关于静态库和动态库的使用和制作方法. http://blog.csdn. ...
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- VC++动态链接库(DLL)编程深入浅出(zz)
VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...
- 索引深入浅出(4/10):非聚集索引的B树结构在聚集表
一个表只能有一个聚集索引,数据行以此聚集索引的顺序进行存储,一个表却能有多个非聚集索引.我们已经讨论了聚集索引的结构,这篇我们会看下非聚集索引结构. 非聚集索引的逻辑呈现 简单来说,非聚集索引是表的子 ...
- 索引深入浅出(5/10):非聚集索引的B树结构在堆表
在“索引深入浅出:非聚集索引的B树结构在聚集表”里,我们讨论了在聚集表上的非聚集索引,这篇文章我们讨论下在堆表上的非聚集索引. 非聚集索引可以在聚集表或堆表上创建.当我们在聚集表上创建非聚集索引时,聚 ...
- 《深入浅出Windows Phone 8.1 应用开发》基于Runtime框架全新升级版
<深入浅出Windows Phone 8.1 应用开发>使用WP8.1 Runtime框架最新的API重写了上一本<深入浅出Windows Phone 8应用开发>大部分的的内 ...
随机推荐
- HDU 3316 My Brute(二维费用流)经典
My Brute Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- eclipse下使用cygwin的方法(Windows下用eclipse玩gcc/g++和gdb)
明天就回国了,今晚回国前写写如何配置eclipse和CDT.这个配置方法网上讨论不是很多,可能用的人少,毕竟Windows上写C++程序多数喜欢VS,即使写的是Linux程序,很多人仍然会用VS(说只 ...
- CreateThread、_beginthreadex和AfxBeginThread .
创建线程好几个函数可以使用,可是它们有什么区别,适用于什么情况呢?参考了一些资料,写得都挺好的,这里做一些摘抄和整合. [参考1]CreateThread, AfxBeginThread,_begin ...
- Opcode查看利器之vld
简介 在PHP的生命周期中 词法分析(zend_language_scanner),将PHP代码转换为语言片段(Tokens) 语法分析(zend_language_parser)将Tokens转换成 ...
- 用setitimer实现多个定时器
从这篇文章中可以看出,setitimer只能实现一个定时器,如果多次调用setitimer,旧值都会被覆盖掉. 如何用setitimer实现多个定时器呢?下面是我的一个实现,具体的方法是: 用链表从小 ...
- HDUOJ-----4506小明系列故事——师兄帮帮忙
小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- 【LeetCode】51. N-Queens
N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...
- 创业就是和靠谱的人一起做热爱的事 印象笔记CEO谈创业
http://www.nowamagic.net/librarys/news/detail/1502在今年美国知名创业孵化器 Y Combinator 的创业学校大会上,印象笔记(Evernote)的 ...
- Android开发学习之对话框浅析
对话框式程序运行中弹出的窗口.Android系统中有四种默认的对话框:警告对话框AlertDialog.进度对话框ProgressDialog.日期选择对话框DatePickerDialog以及时间选 ...
- Tomcat配置+JSP页面模板修改UTF-8
A.修改Tomcat端口号步骤:1.找到Tomcat目录下的conf文件夹2.进入conf文件夹里面找到server.xml文件3.打开server.xml文件4.在server.xml文件里面找到下 ...