zoukankan      html  css  js  c++  java
  • 再论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:引用的本质是别名,而不是一个独立变量。

     

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

     

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

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

  • 相关阅读:
    将python 中的变量保存到本地
    Docker 安装
    docker 守护进程
    迁移及配置 Windows 7 的用户账号 UserProfile 默认目录位置
    Bitwise Operation位操作(逻辑运算)
    博客园客服端上传文章测试
    vnc连接远端linux服务器
    linux7.5服务器 安装oracle12c
    linux服务器 jboss-7安装
    day11__函数名的应用,python新特f-strings格式化输出、迭代器
  • 原文地址:https://www.cnblogs.com/micemik/p/10444514.html
Copyright © 2011-2022 走看看