前言: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指针的更多相关文章

  1. C语言面试题分类->指针

    有关指针的经典面试题 C语言为何如此长寿并实用?C++为什么有那么多精彩?指针可以说是C/C++中的灵魂所在,虽然早期中pascal也有指针,但是和C/C++比起来不是一个级别的.今天为大家深入浅出的 ...

  2. 【C++深入浅出】智能指针之auto_ptr学习

    起:  C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template& ...

  3. 深入浅出C指针

    http://bbs.9ria.com/blog-164422-18039.html 初学者在学习C语言时,通常会遇到两个瓶颈,一个是“递归”,一个是“指针”.大学老师在讲述这两个知识点时通常都是照本 ...

  4. 深入浅出剖析C语言函数指针与回调函数(一)【转】

    本文转载自:http://blog.csdn.net/morixinguan/article/details/65494239 关于静态库和动态库的使用和制作方法. http://blog.csdn. ...

  5. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  6. VC++动态链接库(DLL)编程深入浅出(zz)

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

  7. 索引深入浅出(4/10):非聚集索引的B树结构在聚集表

    一个表只能有一个聚集索引,数据行以此聚集索引的顺序进行存储,一个表却能有多个非聚集索引.我们已经讨论了聚集索引的结构,这篇我们会看下非聚集索引结构. 非聚集索引的逻辑呈现 简单来说,非聚集索引是表的子 ...

  8. 索引深入浅出(5/10):非聚集索引的B树结构在堆表

    在“索引深入浅出:非聚集索引的B树结构在聚集表”里,我们讨论了在聚集表上的非聚集索引,这篇文章我们讨论下在堆表上的非聚集索引. 非聚集索引可以在聚集表或堆表上创建.当我们在聚集表上创建非聚集索引时,聚 ...

  9. 《深入浅出Windows Phone 8.1 应用开发》基于Runtime框架全新升级版

    <深入浅出Windows Phone 8.1 应用开发>使用WP8.1 Runtime框架最新的API重写了上一本<深入浅出Windows Phone 8应用开发>大部分的的内 ...

随机推荐

  1. Theano Logistic Regression

    原理 逻辑回归的推理过程能够參考这篇文章:http://blog.csdn.net/zouxy09/article/details/20319673,当中包括了关于逻辑回归的推理,梯度下降以及pyth ...

  2. Android UI-实现底部切换标签(fragment)

    Android UI-实现底部切换标签(fragment) 前言 本篇博客要分享的一个UI效果--实现底部切换标签,想必大家在一些应用上面遇到过这样的效果了,最典型的就是微信了,能够左右滑动切换页面. ...

  3. nginx中的502错误

    遇到这种情况,首先看一下慢日志 [17-Aug-2015 13:13:43] WARNING: [pool www] child 27780, script '/data/s.com/index.ph ...

  4. 使用mysql遇到的异常

    Can't find any matching row in the user table 原因 更改mysql.user表之后,没有使用flush privileges命令来更新权限. 解决方案 使 ...

  5. 【LeetCode】57. Insert Interval

    Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals ( ...

  6. input text的所有事件

    onBlur 当 text field失去聚焦的时候执行一些代码 onChange 当 text field失去聚焦并且它的值发生变动的时候执行一些代码 onClick 当用户在 text field ...

  7. iOS - AsyncSocket 的使用

    1.AsyncSocket 基于 CFSocket.GCD 进行的封装(OC). 支持 TCP 和 UDP. 完整的回调函数(用于处理各种回调事件,连接成功,断开连接,收到数据等). 需要注意的问题: ...

  8. posix 匿名信号量与互斥锁 示例生产者--消费者问题

    一.posix 信号量 信号量的概念参见这里.前面也讲过system v 信号量,现在来说说posix 信号量. system v 信号量只能用于进程间同步,而posix 信号量除了可以进程间同步,还 ...

  9. Linux内核同步 - memory barrier

    一.前言 我记得以前上学的时候大家经常说的一个词汇叫做所见即所得,有些编程工具是所见即所得的,给程序员带来极大的方便.对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最 ...

  10. spring 中 AOP 功能

    1 PointCut 由 ClassFilter 和 MethodMatcher 构成,通过 ClassFilter 定位到类上,通过 MethodMatcher 定位到方法. 2 Spring 支持 ...