深入浅出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应用开发>大部分的的内 ...
随机推荐
- 对UserDict的研究
# -*- coding: utf-8 -*- #python 27 #xiaodeng #对UserDict的研究 class UserDict(): def __init__(self, dict ...
- java 在控制台上输入密码时,密码不显示在控制台上
用下面的方法可以实现在控制台上输入密码时,密码不显示在控制台上:Console cons=System.console(); System.out.print(" 密码:"); c ...
- LR函数基础(一)
函数用到:web_reg_find(). lr_log_message(). lr_eval_string().strcmp().atoi() Action(){ web_reg_find(&q ...
- 最新美行地图Z13升级攻略
原文地址:http://bbs.gpsuu.com/read.php?tid-231134.html 2013年11月16日订车,4S答应送导航,却没有提送什么导航.12月24日提车,DVD导航一体 ...
- AsyncTask 异步任务基本使用-下载视频
概述 android 提供了一个异步任务类AsyncTask,使创建异步任务.更新UI变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务.本例子将演示并实现,使用AsyncTas ...
- linux常见面试题及答案
1. 在Linux系统中,以文件方式访问设备. 2. Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用i字节来标识. 4. 全部磁盘块由四 ...
- 关于JavaScript中Get/Set访问器
有时候大家可能会纳闷,在使用JavaScript的时候,只需要给一个系统变量赋值就可以触发一系列操作去相应. 但是我们在写Js的时候,修改了一个自定义变量,却连个P都没有.是不是很郁闷呢? 其实,我们 ...
- php 文件上传,下载
文件下载: html: <html> <body> <a href="1.rar">下载1.rar</a> <br /> ...
- Effective C++:条款33:避免遮掩继承而来的名称
(一) 以下这段代码: int x; void someFunc() { double x; //local variable std::cin>>x; //read a new valu ...
- mysql 5.6 grant授权的时候出现问题
mysql> grant select on huamu_licai.* to 'read'@'%' identified by password 'Abcd1234';ERROR 1827 ( ...