很多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)类型的更多相关文章

  1. 深入浅出C++引用(Reference)类型

    要点1:为反复使用的.冗长的变量名称定义一个简短的.易用的别名,从而简化了代码.通常,冗长的变量名称源于多层嵌套对象,例如类中定义嵌套类,类中定义其它类对象. //------ 未使用引用的程序片段, ...

  2. 【JavaScript】从 this 指向到 reference 类型

    判断"this 指向谁"是个老大难的问题. 网络上有许多文章教我们如何判别,但大多艰涩复杂,难以理解. 那么这里介绍一个非常简单实用的判别规则: 1)在函数[调用]时," ...

  3. Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法

    本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...

  4. 浅谈String中的==和对象中引用对象类型的==

    @Test public void test02() { StringBuffer sb = new StringBuffer(); sb.append('a'); sb.append(11); Sy ...

  5. 关于java内存泄露的总结--引用的类型:强引用,弱引用,软引用

    今天面试了一家公司的java开发方面的实习生,被问到一个问题:如何处理java中的内存泄露问题,保证java的虚拟机内存不会被爆掉,当时其实觉得面试官的问题有点泛,所以也没有很好领会他的意思,答案也不 ...

  6. Object-C中对“引用(reference)”的理解

    http://blog.csdn.net/csz0102/article/details/25984275 注:以下讨论都是在ARC模式下 我们在iOS开发中最经常碰到的“引用(reference)” ...

  7. javascript原始值和引用值类型及区别

    原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...

  8. Java中各种引用(Reference)解析

    目录 1,引用类型 2, FinalReference 2.1, Finalizer 3, SoftReference 4, WeakReference 5, PhantomReference 6, ...

  9. jvm内存JVM学习笔记-引用(Reference)机制

    在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...

随机推荐

  1. webstorm git 怎么断开版本控制 webstorm git for windows 禁止 自动运行

    也是无语啊,今天装了下最新版本的webstorm ,  发现特别卡,老动不动就卡死, 看了下进程, 牛X 啊,  git for windows 一直蹭蹭蹭的疯狂增长,一开始的一点到后来的庞然大物. ...

  2. 关于modelmap.addAttribute("",)转到jsp页面获取不到值的问题

    问题一,可能是你设置的web.xml的头有问题 掉坑里好一会,发现我默认生成的web.xml中头部的配置是 <!DOCTYPE web-app PUBLIC "-//Sun Micro ...

  3. How to save rules of the iptables?

    The easy way is to use iptables-persistent. Install iptables-persistent: sudo apt-get install iptabl ...

  4. Ubuntu 批量修改图片大小

    现在的相机拍摄出来的照片通常远远大于电脑屏幕,不但尺寸很大,占用磁盘量也很大,我都是拍完照片立马就将其缩小到差不多HD的分辨率 改图片分辨率的软件有很多,除了耳熟能详的PS,Ubuntu下也有开源gi ...

  5. 四元数(Quaternion)和旋转 +欧拉角

    四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...

  6. 如何使用chrome devtool调试Mobile网页?

    凡是做过mobile网页web app开发的朋友一定对开发效率的底下会有吐槽.现在chrome dev tool改变了程序员们的苦比. 0.登录google chrome 1. chrome://in ...

  7. 打通版微社区(6):部署微信插件及开通QQ云服务

    写在前面: 此文是我最后写的.其实实际部署的时候,我是先安装了论坛并试图开通微信的微社区.发现微社区需要在微信公众平台的开发者中心里配置 "网页账号,网页授权获取用户基本信息"为论 ...

  8. Linux中脚本的使用方法

    Linux中脚本的使用方法 一.前言 关于Linux中的脚本的用法,一直没有时间去好好地总结,正好今天下雨,就好好的整理一下思路吧,其实精通了一门语言,比如C语言,学习其他语言需要的成本是非常少的,同 ...

  9. Android Studio Git .gitignore文件配置忽略不需要的文件

    转载请标明出处: http://www.cnblogs.com/why168888/p/6440805.html 本文出自:[Edwin博客园] # Built application files * ...

  10. 理解活在Iphone中的那些App (四)

    App生存环境之宿主环境 终于开始说一些技术性的话题了,从这里开始的一些技术细节的东西,以前我也没有太刻意的注意过.为了写这个也是刚刚看了一点资料,如果有纰漏,恳请指出. 一个App生存的宿主环境主要 ...