Ⅰ、类成员函数的隐式参数 T *const this 。

就是说对于某个类的成员函数 returnType function() 的真实面目其实是这样的 returnType function(T *const this) 。

如果调用 obj.function() ,可以认为编译器将该调用重写成了 function(&obj) 。

Ⅱ、常量成员函数。

他看上去是这样的 returnType function() const ,真实面目这个样 returnType function(const T *const this) 。

从使用者的角度来说,什么时候考虑加 const 呢?一般来说是在该方法中对象“只读”的时候。

在我的印象中, Java 中似乎是不存在这种考虑的,所有对象都默认为非常量,所以 C++ 为什么要有这个玩意儿?!!!对于这个问题我思考了很久,虽然在设计类的时候总是会考虑加不加 const 的问题,但是在实际创建对象的时候真的很少会写类似于 const Person p; 这样的东西。一个比较勉强的解释是,现实生活中总存在一些不变的东西,常量对象用于抽象表达这类事物。

网上的解释:C++ const解析(转)

Const 作用

.   const类型定义:指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令

.   可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。

.   编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

.    可以节省空间,避免不必要的内存分配。

Ⅲ、编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数体(就是指花括号{}里的东西)。

因此,成员函数体可以随意使用类中的其他成员而无需在意这些成员的出现次序,不论这个成员函数体是在类里面还是类外面,是在成员变量前,还是在成员变量后。

Ⅳ、返回引用类型,形如 returnType& function() 。

回忆一下 C++ 的引用:

  • 引用即别名
  • 引用必须初始化,引用形参绑定初始化它的对象
  • 使用引用避免拷贝
  • 使用引用形参返回额外信息(有时会比返回一个自定义数据类型方便)
  • 尽量使用常量引用(相对于普通引用,常量引用能够绑定的对象范围更广,例如 const string &s 作为形参还可以绑定字面值)

返回一个值的方式和初始化一个变量或者形参的方式完全一样:返回的值用于初始化调用点的一个临时量,该临时量就是函数调用的结果。

因此调用 function() 的时候,相当于对 returnType& temp 做了一次初始化,temp 是一个别名,不会产生拷贝!需要注意的是不要返回局部变量的引用,可返回的有 *this 、形参的引用(这个形参也必须是别名!而非临时的变量)。

相关阅读:

C++ 第三十三天的更多相关文章

  1. COJ967 WZJ的数据结构(负三十三)

    WZJ的数据结构(负三十三) 难度级别:C: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...

  2. NeHe OpenGL教程 第三十三课:TGA文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. COJ 0967 WZJ的数据结构(负三十三)

    WZJ的数据结构(负三十三) 难度级别:E: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...

  4. 三十三、Java图形化界面设计——布局管理器之null布局(空布局)

    摘自http://blog.csdn.net/liujun13579/article/details/7774267 三十三.Java图形化界面设计--布局管理器之null布局(空布局) 一般容器都有 ...

  5. JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录

    JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Soc ...

  6. Gradle 1.12用户指南翻译——第三十三章. PMD 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  7. “全栈2019”Java多线程第三十三章:await与signal/signalAll

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. “全栈2019”Java第三十三章:方法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. 孤荷凌寒自学python第三十三天python的文件操作初识

     孤荷凌寒自学python第三十三天python的文件操作初识 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天开始自学python的普通 文件操作部分的内容. 一.python的文件打开 ...

  10. 微信小程序把玩(三十三)Record API

    原文:微信小程序把玩(三十三)Record API 其实这个API也挺奇葩的,录音结束后success不走,complete不走,fail也不走, 不知道是不是因为电脑测试的原因,只能等公测或者等他们 ...

随机推荐

  1. Securi-Pi:使用树莓派作为安全跳板

    导读 像很多 LinuxJournal 的读者一样,我也过上了当今非常普遍的“科技游牧”生活,在网络之间,从一个接入点到另一个接入点,我们身处现实世界的不同地方却始终保持连接到互联网和日常使用的其它网 ...

  2. Java/android 里ClassName.this和this的使用

    如果在内部类里面用this就是指这个内部类的实例,而如果用OuterClassName.this就是它外面的那个类的实例 ClassName.this这个用法多用于在nested class(内部类) ...

  3. new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。

    new运算符 - JavaScript | MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operator ...

  4. 出现unmapped spring configuration files found

    intell idea启动出现unmapped spring configuration files found提示. 把spring里面的内容都打勾.

  5. 剑指Offer——复杂链表的复制

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用, ...

  6. python 将日期戳(五位数时间)转换为标准时间

    5位数日期戳 读取 .mat 文件处理里面数据时,发现里面的日期数据全部都是 “5位数” 数字,很不解: 后来查到可以在excel中通过设置单元格调回标准日期格式,如下: 选中日期戳,右键选择 “格式 ...

  7. 由link和@import的区别引发的CSS渲染杂谈

    我们都知道,外部引入 CSS 有2种方式,link标签和@import. 它们有何本质区别,有何使用建议,在考察外部引入 CSS 这部分内容时,经常被提起. 如今,很多学者本着知其然不欲知其所以然的学 ...

  8. python发送邮件的2种方式

    发送邮件的2种方式1.匿名发送 smtpObj = smtplib.SMTP(host, port) smtpObj.sendmail(from_addr, to_addrs, message.as_ ...

  9. 012-基于 git hooks 的前端代码质量控制解决方案

    原文看这里:https://github.com/kuitos/kui...全部文章看这里 https://github.com/kuitos/kui... 国际惯例先说下故事背景 通常情况下,如果我 ...

  10. 001-ant design pro 页面加载原理及过程,@connect 装饰器

    一.概述 以列表页中的标准列表为主 Ant Design Pro 默认通过只需浏览器单方面就可处理的 HashHistory 来完成路由.如果要切换为 BrowserHistory,那在 src/in ...