在C ++ 中引用好比一个对象的量子纠缠态,改变这个纠缠态,就改变对象

我们知道,参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上

对于像 char、bool、int、float 等基本类型的数据,它们占用的内存往往只有几个字节,对它们进行内存拷贝非常快速。而数组、结构体、对象是一系列数据的集合,数据的数量没有限制,可能很少,也可能成千上万,对它们进行频繁的内存拷贝可能会消耗很多时间,拖慢程序的执行效率。

C/C++ 禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,这点已在《C语言指针变量作为函数参数》中进行了讲解。而对于结构体和对象没有这种限制,调用函数时既可以传递指针,也可以直接传递内容;为了提高效率,我曾建议传递指针
  但是在 C++ 中,我们有了一种比指针更加便捷的传递聚合类型数据的方式,那就是引用(Reference)。

引用(Reference)是 C++ 相对于C语言的又一个扩充。引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。引用类似于 Windows 中的快捷方式,一个可执行程序可以有多个快捷方式,通过这些快捷方式和可执行程序本身都能够运行程序;引用还类似于人的绰号(笔名),使用绰号(笔名)和本名都能表示一个人。

引用的定义方式类似于指针,只是用&取代了*,语法格式为:

type &name = data;

type 是被引用的数据的类型,name 是引用的名称,data 是被引用的数据。引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(const 变量)。

#include <iostream>
using namespace std;
int main() {int a = 99;int &r = a;cout << a << ", " << r << endl;cout << &a << ", " << &r << endl;return 0;
}
99, 99
0x7ffe457b9a9c, 0x7ffe457b9a9c

本例中,变量 r 就是变量 a 的引用,它们用来指代同一份数据;也可以说变量 r 是变量 a 的另一个名字。从输出结果可以看出,a 和 r 的地址一样,都是0x28ff44;或者说地址为0x28ff44的内存有两个名字,a 和 r,想要访问该内存上的数据时,使用哪个名字都行。

注意,引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址。如上面代码所示,第 6 行中的&表示引用,第 8 行中的&表示取地址。除了这两种用法,&还可以表示位运算中的与运算。

由于引用 r 和原始变量 a 都是指向同一地址,所以通过引用也可以修改原始变量中所存储的数据,请看下面的例子

#include <iostream>
using namespace std;
int main() {int a = 99;int &r = a;r = 47;cout << a << ", " << r << endl;return 0;
}
47, 47

如果读者不希望通过引用来修改原始的数据,那么可以在定义时添加 const 限制,形式为:
const type &name = value;

也可以是:
type const &name = value;

这种引用方式为常引用

C++引用入门教程(一)相关推荐

  1. C++入门教程(四十二):函数参数使用引用

    小古银的官方网站(完整教程):http://www.xiaoguyin.com/ C++入门教程视频:https://www.bilibili.com/video/av20868986/ 目录 目录 ...

  2. c语言中结构体数组的引用,【C语言入门教程】7.2 结构体数组的定义和引用

    7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...

  3. 【Arduino】开发入门教程【一】什么是Arduino

    Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...

  4. Scala开发入门教程

    出处:http://blog.csdn.net/mapdigit/article/details/21878083 Scala语言和其它语言比如Java相比,算是一个比较复杂的语言,它是一个面向对象和 ...

  5. 艾伟:正则表达式30分钟入门教程

    本文目标 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它. 如何使用本教程 最重要的是--请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在3 ...

  6. C#游戏开发快速入门教程Unity5.5教程

    C#游戏开发快速入门教程Unity5.5教程 试读文档下载地址:http://pan.baidu.com/s/1slwBHoD C#是微软发布的高级程序设计语言,这门语言和C语言一样,已经成为了大学计 ...

  7. ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用

    原文:ASP.NET Core 入门教程 2.使用ASP.NET Core MVC框架构建Web应用 一.前言 1.本文主要内容 使用dotnet cli创建基于解决方案(sln+csproj)的项目 ...

  8. 【LaTeX】E喵的LaTeX新手入门教程(4)图表

    这里说的不是用LaTeX画图,而是插入已经画好的图片..想看画图可以把滚动条拉到底.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇  [LaTeX]E喵的LaTeX新手入门教程(2)基 ...

  9. python语言入门教程-菜鸟学Python入门教程大盘点|7个多月的心血总结

    原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...

最新文章

  1. 微软宣布Azure Functions正式支持Java
  2. IOS开发之——颜色设置
  3. 精灵沿着正方形路线运动暂停2秒后然后再将自己放大4倍
  4. React学习:脚手架搭建、antd引入-学习笔记
  5. python使用spark sql查询impala_如何使用JDBC将Impala表直接加载到Spark?
  6. java求二维数组每行的最大值_用JAVA输入一个二维数组a[3][4]的元素值,求输出其元素最大值...
  7. windows中启动 java -jar 后台运行程序
  8. 路由器Lan、Wan短接问题
  9. java properties $,如何引用java.util.Properties中的另一个属性?
  10. shell编程 date、md5sum、curl
  11. JS 通过选择百度地图地址获取经纬度自动填充到文本框中的方法
  12. MATLAB卷积conv、conv2、convn详解
  13. 网络流行简笔画图片大全,互联网图标简笔画
  14. 二叉树的学习:前中后序遍历方法
  15. 应用程序正常初始化 0x0150002失败
  16. win10系统声音很小
  17. esp32 Flash分区与OTA功能简析
  18. Linux串口通信之termios结构体说明
  19. 怎样计算系统的可靠性和可用性是几个9?
  20. PostGIS中geometry与geography的区别

热门文章

  1. Vivado篇(一)Notepad++编写的Verilog文件导入Vivado,中文注释乱码问题
  2. java8新特性-lambda表达式和stream API的简单使用
  3. Android App解决卡顿慢之内存抖动及内存泄漏(发现和定位)
  4. 给Ocelot做一个Docker 镜像
  5. 免安装版 mysql-5.6.29-winx64 下载,配置
  6. 邮件办公系统Exchange
  7. qt数据库有效插件为空的情况
  8. 年中总结(2013年3月到2013年9月)
  9. 非你所想:eigrp非等价负载均衡
  10. Eclipse无法找到Java EE Tools选项问题解决方案