深入浅出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应用开发>大部分的的内 ...
随机推荐
- nginx反向代理proxy_set_header自定义header头无效
公司使用nginx作为负载均衡,有时候需要自定义header头发送给后端的真实服务器. 想过去应该是非常的简单的事情. 例子如下: 设置代理服务器ip头 1 proxy_set_header X- ...
- 狄斯奎诺(dijkstra 模板)
/*狄斯奎诺算法(dijkstra)<邻接表> */ #include<stdio.h> #include<string.h> #include<stdlib ...
- linux常见面试题及答案
1. 在Linux系统中,以文件方式访问设备. 2. Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用i字节来标识. 4. 全部磁盘块由四 ...
- MVC图片上传、浏览、删除 ASP.NET MVC之文件上传【一】(八) ASP.NET MVC 图片上传到服务器
MVC图片上传.浏览.删除 1.存储配置信息 在web.config中,添加配置信息节点 <appSettings> <add key="UploadPath" ...
- .NET操作XML文件之泛型集合的序列化与反序列化
程序集:System.Xml.Serialization(在 System.Xml.Serialization.dll 中) 命名空间:System.Xml.Serialization 公共函数代码: ...
- JMeter学习笔记---作用域规则
JMeter测试树中既包含遵循分层规则的测试元件(监听器.配置元件.后置处理器.前置处理器.断言.定时器),又包含遵循顺序规则的测试元件(逻辑控制器.采样器),测试人员创建测试计划的同时,实际上就创建 ...
- Shlwapi.h头文件的使用
// TestShlwAPI.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include <Shlwapi.h>#pragma ...
- Hive学习之函数DDL和Show、Describe语句
创建/删除函数 创建暂时函数 以下的语句创建由class_name实现的暂时函数,该函数被创建后仅仅能够在当前会话中使用.会话结束后函数失效. 实现函数的类能够是Hive类路径中的随意类.能够使用Ad ...
- Python isalnum() 方法
描述 Python isalnum() 方法检测字符串是否由字母和数字组成. 语法 isalnum()方法语法: S.isalnum() 参数 无. 返回值 如果字符串至少有一个字符并且所有字符都是字 ...
- 清除sqlserver日志方法(不适合always on)
清除sqlserver日志方法 --查看数据库的recovery_model_desc类型 SELECT NAME, recovery_model_desc FROM sys.databases -- ...