再论C++引用(reference)类型

 

很多C++初学者搞不清楚C++引用类型,不知有什么用,所以也不知怎么用。一个问题令人迷惑,不是读者有问题,而是教科书有问题。

和多数初学者一样,笔者在初学C++时,关于引用类型,教科书上也是如下表所述:

int a = 0

int &b = a; // b a的引用

b = 4; // 访问b 实际上是访问a

 

如果引用仅此而已,那引用真的就没用。所以,我们的教科书及其作者太懒、太烂。

 

先来看一个例子,假设你要寄一个快递给朋友,这个朋友的地址是:

 

中国新疆维吾尔自治区乌鲁木齐市玄武区顺安路123456号楼789999

 

如果每天寄快递,每天都要写这么一长串的地址,就会有2个问题:繁琐,易出错。

如果我们为这么长的地址取一个短的别名,例如"流狗肉",然后借助计算机快递系统自动将"流狗肉"映射为原来的长地址。就可以大大简化地址的书写,大大降低出错率。

 

C++中,使用引用的一个重要目的(不是唯一目的)是:为反复、频繁使用的长名称的变量取一个短名称,从而简化源程序降低错误率

 

再来看个例子:

Form->DBGrid->Button->TextFont->Color表示:

一个Form由很多子对象构成,其中一个对象是DBGrid

一个DBGrid由很多子对象构成,其中一个对象是Button

一个Button由很多子对象构成,其中一个对象是TextFont

一个TextFont由很多子对象构成,其中一个对象是Color

 

如果我们要对Form->DBGrid->Button->TextFont->Color100次赋值,而且不能用循环,如下表所示:

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

btColor = clRed; // 1次赋值

btColor = 0xFF210839; // 2次赋值

btColor = 0xFF215639; // 3次赋值

btColor = 0xFF215769; // 99次赋值

btColor = 0x67215769; // 100次赋值

 

看到了吧,程序大为简洁,出错率大大降低。

 

结论1:使用引用,对于人(码农)来说:大大简化了源代码,降低了出错率。

结论2:对编译器和计算机来说:使用引用和不使用引用,都是对同一对象进行处理,没有任何丝毫差异。

结论3:引用的本质是别名,而不是一个独立变量。

 

所以,使用引用方便了人,但对计算机的数据处理毫无影响。

 

何时使用引用? 反复、频繁使用长名称的变量对象

何时不用引用? 变量名称很短,或者偶尔用一次长名称变量。

posted on 2019-02-27 16:22  micemik  阅读(247)  评论(0编辑  收藏  举报

导航