C++ 第三十三天
Ⅰ、类成员函数的隐式参数 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++ 第三十三天的更多相关文章
- COJ967 WZJ的数据结构(负三十三)
WZJ的数据结构(负三十三) 难度级别:C: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...
- NeHe OpenGL教程 第三十三课:TGA文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- COJ 0967 WZJ的数据结构(负三十三)
WZJ的数据结构(负三十三) 难度级别:E: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...
- 三十三、Java图形化界面设计——布局管理器之null布局(空布局)
摘自http://blog.csdn.net/liujun13579/article/details/7774267 三十三.Java图形化界面设计--布局管理器之null布局(空布局) 一般容器都有 ...
- JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录
JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Soc ...
- Gradle 1.12用户指南翻译——第三十三章. PMD 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- “全栈2019”Java多线程第三十三章:await与signal/signalAll
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第三十三章:方法
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 孤荷凌寒自学python第三十三天python的文件操作初识
孤荷凌寒自学python第三十三天python的文件操作初识 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天开始自学python的普通 文件操作部分的内容. 一.python的文件打开 ...
- 微信小程序把玩(三十三)Record API
原文:微信小程序把玩(三十三)Record API 其实这个API也挺奇葩的,录音结束后success不走,complete不走,fail也不走, 不知道是不是因为电脑测试的原因,只能等公测或者等他们 ...
随机推荐
- Docker1.12 + Swarm 构建动态微服务应用
导读 我们在之前提到过一个示例,即一款由前端与多项后端服务共同构成的微服务应用.其中前端为Traefik HTTP代理,负责将各项请求路由至后端服务.而后端则非常简单,是一套基于Go的HTTP Web ...
- 【BZOJ1495】[NOI2006]网络收费 暴力+DP
[BZOJ1495][NOI2006]网络收费 Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而,不可忽视的一点就是网络本身有 ...
- PHP 开发环境的搭建和使用03-- 安装mySql
1/ 安装的MySQL版本是5.6.10版本的,直接点击Install 2/ 选择 Execute 3/ 更新最新版本成功后,选择 "next" 4/ 自定义安装方式,选择C ...
- 修改 GitHub 仓库默认显示的项目语言类型
GitHub 是采用 Linguist 来自动识别仓库代码应该归为哪一类的,也就是根据项目里文件数目最多的文件类型来识别项目类型. 解决办法是:在仓库的根目录下创建或修改 .gitattributes ...
- Tortoise SVN 使用
1.添加文件或文件夹 2.删除文件或文件夹 ①If you want to delete an item from the repository, but keep it locally as an ...
- Win7环境下 IIS配置
一.介绍IIS Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是Windows ...
- Mysql 多主一从数据备份
Mysql 多主一从数据备份 概述 对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库中的数据一致. 这样做有如下几点好处: 可以做灾备,其中一个坏了可以切换到另一个. 可以做负载均 ...
- UDP和TCP的主要特点
UDP的主要特点是:(1)无连接:(2)尽最大努力交付:(3)面向报文:(4)无拥塞控制:(5)支持一对一.一对多.多对一和多对多的交互通信:(6)首部开销小(只有四个字段:源端口.目的端口.长度.检 ...
- 剑指Offer——数组中的逆序对
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100 ...
- LayoutInflater的动态增加控件
在实际开发中LayoutInflater这个类是非常有用的,它的作用类似于 findViewById(),不同点是LayoutInflater是用来找layout下xml布局文件. 而findView ...