再论C++引用(reference)类型
很多C++初学者搞不清楚C++引用类型,不知有什么用,所以也不知怎么用。一个问题令人迷惑,不是读者有问题,而是教科书有问题。
和多数初学者一样,笔者在初学C++时,关于引用类型,教科书上也是如下表所述:
|
int a = 0 int &b = a; // b 是a的引用 b = 4; // 访问b 实际上是访问a |
如果引用仅此而已,那引用真的就没用。所以,我们的教科书及其作者太懒、太烂。
先来看一个例子,假设你要寄一个快递给朋友,这个朋友的地址是:
号56号楼78门9999室
如果每天寄快递,每天都要写这么一长串的地址,就会有2个问题:繁琐,易出错。
如果我们为这么长的地址取一个短的别名,例如"流狗肉",然后借助计算机快递系统自动将"流狗肉"映射为原来的长地址。就可以大大简化地址的书写,大大降低出错率。
在C++中,使用引用的一个重要目的(不是唯一目的)是:为反复、频繁使用的长名称的变量取一个短名称,从而简化源程序,降低错误率。
再来看个例子:
Form->DBGrid->Button->TextFont->Color表示:
一个Form由很多子对象构成,其中一个对象是DBGrid。
一个DBGrid由很多子对象构成,其中一个对象是Button。
一个Button由很多子对象构成,其中一个对象是TextFont。
一个TextFont由很多子对象构成,其中一个对象是Color。
如果我们要对Form->DBGrid->Button->TextFont->Color做100次赋值,而且不能用循环,如下表所示:
|
Form->DBGrid->Button->TextFont->Color = clRed; // 第1次赋值 Form->DBGrid->Button->TextFont->Color = 0xFF210839; // 第2次赋值 Form->DBGrid->Button->TextFont->Color = 0xFF215639; // 第3次赋值 … Form->DBGrid->Button->TextFont->Color = 0xFF215769; // 第99次赋值 Form->DBGrid->Button->TextFont->Color = 0x67215769; // 第100次赋值 |
上表程序的特点是:大量冗长而繁琐的重复,眼花缭乱,汗流浃背,极易出错。
同样的功能,我们用引用来实现,如下表所示:
|
// 为对象Form->DBGrid->Button->TextFont->Color取一个别名 auto &btColor = Form->DBGrid->Button->TextFont->Color; // 对Form->DBGrid->Button->TextFont->Color赋值100次 次赋值 次赋值 次赋值 … 次赋值 次赋值 |
看到了吧,程序大为简洁,出错率大大降低。
结论1:使用引用,对于人(码农)来说:大大简化了源代码,降低了出错率。
结论2:对编译器和计算机来说:使用引用和不使用引用,都是对同一对象进行处理,没有任何丝毫差异。
结论3:引用的本质是别名,而不是一个独立变量。
所以,使用引用方便了人,但对计算机的数据处理毫无影响。
何时使用引用? 反复、频繁使用长名称的变量对象
何时不用引用? 变量名称很短,或者偶尔用一次长名称变量。
再论C++引用(reference)类型的更多相关文章
- 深入浅出C++引用(Reference)类型
要点1:为反复使用的.冗长的变量名称定义一个简短的.易用的别名,从而简化了代码.通常,冗长的变量名称源于多层嵌套对象,例如类中定义嵌套类,类中定义其它类对象. //------ 未使用引用的程序片段, ...
- 【JavaScript】从 this 指向到 reference 类型
判断"this 指向谁"是个老大难的问题. 网络上有许多文章教我们如何判别,但大多艰涩复杂,难以理解. 那么这里介绍一个非常简单实用的判别规则: 1)在函数[调用]时," ...
- Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法
本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...
- 浅谈String中的==和对象中引用对象类型的==
@Test public void test02() { StringBuffer sb = new StringBuffer(); sb.append('a'); sb.append(11); Sy ...
- 关于java内存泄露的总结--引用的类型:强引用,弱引用,软引用
今天面试了一家公司的java开发方面的实习生,被问到一个问题:如何处理java中的内存泄露问题,保证java的虚拟机内存不会被爆掉,当时其实觉得面试官的问题有点泛,所以也没有很好领会他的意思,答案也不 ...
- Object-C中对“引用(reference)”的理解
http://blog.csdn.net/csz0102/article/details/25984275 注:以下讨论都是在ARC模式下 我们在iOS开发中最经常碰到的“引用(reference)” ...
- javascript原始值和引用值类型及区别
原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...
- Java中各种引用(Reference)解析
目录 1,引用类型 2, FinalReference 2.1, Finalizer 3, SoftReference 4, WeakReference 5, PhantomReference 6, ...
- jvm内存JVM学习笔记-引用(Reference)机制
在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...
随机推荐
- Java设计模式—享元模式
享元模式:是池技术的重要实现方式. 定义如下: 使用共享对象可有效地支持大量的细粒度的对象. 个人理解:享元模式利用共享对象的技术,解决了Java中内存溢出的问题. 享元模式的定义为我们提出了两个要求 ...
- Client tried to access password protected page without proper authorization (status code 401) 无法发布SceneService的解决方法
前不久,一客户反映原来已经部署好的WebGIS系统忽然无法正常运行了,具体配置如下: Portal for ArcGIS 10.5 ArcGIS Server 10.5 Web Adpator 10. ...
- C++学习笔记(2)----类模板和友元
当一个类包含一个友元声明时,类与友元各自是否是模板是相互无关的.如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例.如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定 ...
- unistd.h文件
转载地址:http://baike.baidu.com/link?url=nEyMMFYevs4yoHgQUs2bcfd5WApHUKx0b1ervi7ulR09YhtqC4txmvL1Ce3FS8x ...
- Mysql备份 -----innobackupex
一,原理及介绍〇 xtrabackup能做哪些 对InnoDB引擎的表做热备 增量备份 流压缩传输到另外的服务器上 在线移动表 更简单的创建从库 备份时不增加服务器 ...
- 并发编程------->操作系统的发展
手工操作 —— 穿孔卡片 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然 ...
- Python实例---抽屉热搜榜前端代码分析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php时间函数大锦集
PHP中的时间函数有这么些:(1)date用法: date(格式,[时间]);如果没有时间参数,则使用当前时间. 格式是一个字符串,其中以下字符有特殊意义:U 替换成从一个起始时间(好象是1970年1 ...
- 关于Oracle伪列rownum
rownum列跟rowid列不一样,虽然同为表的伪列.但是rowid列是列的一个固定属性,而rownum列是结果集的一个排序.所以像如下查询是不会返回结果的:select rowid,rownum,e ...
- 020.2.3 math类
内容:一个数的最小整数,平方,随机数其他数学上常用的,去API里面找些对象试一下,在Java.lang包里面 Math.ceil()返回一个大于这个小数的最小整数,比如12.56156,返回13 Ma ...