C++引用入门教程(一)
在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++引用入门教程(一)相关推荐
- C++入门教程(四十二):函数参数使用引用
小古银的官方网站(完整教程):http://www.xiaoguyin.com/ C++入门教程视频:https://www.bilibili.com/video/av20868986/ 目录 目录 ...
- c语言中结构体数组的引用,【C语言入门教程】7.2 结构体数组的定义和引用
7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...
- 【Arduino】开发入门教程【一】什么是Arduino
Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...
- Scala开发入门教程
出处:http://blog.csdn.net/mapdigit/article/details/21878083 Scala语言和其它语言比如Java相比,算是一个比较复杂的语言,它是一个面向对象和 ...
- 艾伟:正则表达式30分钟入门教程
本文目标 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它. 如何使用本教程 最重要的是--请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在3 ...
- C#游戏开发快速入门教程Unity5.5教程
C#游戏开发快速入门教程Unity5.5教程 试读文档下载地址:http://pan.baidu.com/s/1slwBHoD C#是微软发布的高级程序设计语言,这门语言和C语言一样,已经成为了大学计 ...
- ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用
原文:ASP.NET Core 入门教程 2.使用ASP.NET Core MVC框架构建Web应用 一.前言 1.本文主要内容 使用dotnet cli创建基于解决方案(sln+csproj)的项目 ...
- 【LaTeX】E喵的LaTeX新手入门教程(4)图表
这里说的不是用LaTeX画图,而是插入已经画好的图片..想看画图可以把滚动条拉到底.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基 ...
- python语言入门教程-菜鸟学Python入门教程大盘点|7个多月的心血总结
原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...
最新文章
- 微软宣布Azure Functions正式支持Java
- IOS开发之——颜色设置
- 精灵沿着正方形路线运动暂停2秒后然后再将自己放大4倍
- React学习:脚手架搭建、antd引入-学习笔记
- python使用spark sql查询impala_如何使用JDBC将Impala表直接加载到Spark?
- java求二维数组每行的最大值_用JAVA输入一个二维数组a[3][4]的元素值,求输出其元素最大值...
- windows中启动 java -jar 后台运行程序
- 路由器Lan、Wan短接问题
- java properties $,如何引用java.util.Properties中的另一个属性?
- shell编程 date、md5sum、curl
- JS 通过选择百度地图地址获取经纬度自动填充到文本框中的方法
- MATLAB卷积conv、conv2、convn详解
- 网络流行简笔画图片大全,互联网图标简笔画
- 二叉树的学习:前中后序遍历方法
- 应用程序正常初始化 0x0150002失败
- win10系统声音很小
- esp32 Flash分区与OTA功能简析
- Linux串口通信之termios结构体说明
- 怎样计算系统的可靠性和可用性是几个9?
- PostGIS中geometry与geography的区别