C++编程语言中引用(reference)介绍
本文主要介绍 C++ 编程语言中引用(reference)的相关知识,同时通过示例代码介绍引用的使用方法。
1 概述
1.1 What
引用,就是某一变量(目标)的一个别名,对引用的操作等同于对该变量(目标)的直接操作。
引用是 C++ 语言对 C 语言的重要扩充。
引用名是变量的一个别名,即它是某个已经存在变量的另一个名字,一旦把引用初始化为某个变量,就可以使用该引用名称来指向那个变量。如果把变量名称作为变量附属在内存位置中的一个标签,那么就可以把对应的引用名称当成是变量附属在内存位置中的第二个标签,因此,可以通过原始变量名称(即原始标签)或引用名称(第二个标签)来访问变量的内容。
1.2 How
引用的声明方法与指针相似,只是用符号“&”代替了符号“*”。引用的声明方法如下:
类型标识符& 引用名 = 目标变量名
例如,有以下引用声明:
int i;
int& j = i;
在上述声明中,“&”读作“引用”,上述声明可以描述为“j 是一个初始化为 i 的整型引用”。
1.3 引用和指针的区别
引用很容易与指针混淆,两者之间主要有以下区别:
- 不存在空引用,引用必须连接到一块合法的内存;
- 一旦引用被初始化为一个对象(即变量、目标),就不能被指向另一个对象,而指针可以在任何时候指向另一个对象;
- 引用必须在声明时进行初始化,而指针可以在任何时候进行初始化。
2 示例代码
下面会通过几个示例代码来详细讲述引用的用法和作用。
2.1 简单示例
给出一个简单的示例代码,内容如下:
#include <iostream>using namespace std;int main()
{// 声明变量int i;// 声明引用变量int& j = i;// 定义变量i = 5;cout << "Value of i is: " << i << endl;cout << "Value of j is: " << j << endl;cout << "Addr of i is: " << &i << endl;cout << "Addr of j is: " << &j << endl;// 声明变量int x;// 声明变量int y = x;// 定义变量x = 6;cout << "Value of x is: " << x << endl;cout << "Value of y is: " << y << endl;cout << "Addr of x is: " << &x << endl;cout << "Addr of y is: " << &y << endl;return 0;
}
编译并运行上述代码,结果如下:
通过上述运行结果,可知:
- 使用引用时,引用变量 j 与原始变量 i 指向同一段内存空间;不使用引用时,新声明的变量 y 会开辟一块新的内存空间。
给出另外一个简单的示例代码,内容如下:
#include <iostream>using namespace std;int main()
{// 声明变量int i;// 声明引用变量int& j = i;// 定义变量i = 5;cout << "Value of i is: " << i << endl;cout << "Value of j is: " << j << endl;cout << "Addr of i is: " << &i << endl;cout << "Addr of j is: " << &j << endl;// 定义变量int k = 6;// 改变引用变量j的值j = k;cout << "Value of k is: " << k << endl;cout << "Value of j is: " << j << endl;cout << "Value of i is: " << i << endl;cout << "Addr of k is: " << &k << endl;cout << "Addr of j is: " << &j << endl;return 0;
}
编译并执行上述代码,结果如下:
通过上述运行结果,可知:
- 虽然在执行语句“j = k;”后,引用 j 的值变为了“6”,但是 j 仍然指向变量 i 的地址空间,这点没有发生改变,也就时说语句“j = k;”只是将 k 的值赋给引用 j 所指向的地址空间对应的变量(如 j 和 i),并没有改变引用 j 的指向。
2.2 引用作为参数
C++ 之所以增加“引用”类型,主要是要将其作为函数参数,以扩充函数传递数据的功能。
在 C++ 中进行函数传参,有以下几种情况:
- 将变量名作为实参和形参:这种情况下,传给形参的是变量的值,参数传递是单向的。如果在函数执行期间,形参的值发生了变化,(这种变化)不会影响到实参的值,即参数变化不回传,这是因为在调用函数期间,形参和实参不属于同一个存储单元。(原理同 C 语言一致)
- 传递变量的指针:这种情况下,形参是指针变量,实参是变量的地址。在调用函数时,形参(指针变量)指向实参变量单元。这种传递指针变量的方式,通过改变形参指针指向的值,可以改变实参的值。(原理同 C 语言一致)
- C++提供的传递变量的引用:这种情况下,形参是引用变量,和实参是同一个变量。在调用函数时,形参(引用变量)指向实参变量单元。这种传递引用变量的方式,通过改变引用的值,可以改变实参的值。
将引用作为参数,示例代码的内容如下:
#include <iostream>using namespace std;// 函数声明
int swap(int& x, int& y);int main()
{// 局部变量声明int a = 1;int b = 2;cout << "before swap, a is: " << a << endl;cout << "before swap, b is: " << b << endl;// 调用函数来交换值swap(a, b);cout << "after swap, a is: " << a << endl;cout << "after swap, b is: " << b << endl;return 0;
}// 函数定义
int swap(int& x, int& y)
{int temp;temp = x;x = y;y = temp;return 0;
}
编译并执行上述代码,结果如下:
从上述结果能够看到,通过调用 swap 函数,变量 a 和 b 的值发生了改变。
2.3 引用作为返回值
通过使用引用替代指针,会使 C++ 程序更容易阅读和维护。
C++ 函数可以返回一个引用,(返回方式)与返回一个指针类似。当函数返回一个引用时,实际上是返回一个指向返回值的隐式指针。
使用引用作为函数返回值,主要有以下几个优点:
- 在函数返回时,内存中不会再生成返回值的临时变量了,从而提升了程序的时间和空间效率;
- 可以将函数放在赋值语句的左边了。
将引用作为函数返回值,示例代码的内容如下:
#include <iostream>using namespace std;int Array[] = {1, 2, 3, 4, 5};int& SetValues(int i)
{// 返回第i个元素的引用return Array[i];
}int main()
{cout << "Before SetValues: " << endl;for (int i = 0; i < 5; i++){cout << "Array[" << i << "] = ";cout << Array[i] << endl;}// 改变第2个元素的值SetValues(1) = 20;// 改变第4个元素的值SetValues(3) = 40;cout << "After SetValues:" << endl;for (int i = 0; i < 5; i++){cout << "Array[" << i << "] = ";cout << Array[i] << endl;}return 0;
}
编译并执行上述代码,结果如下:
根据上述结果能够知道,通过将引用作为函数返回值,实现了将函数作为赋值语句左值、改变函数返回值的效果。
注意:当函数返回一个引用时,需要注意被引用的对象不能超出其作用域,所以返回一个局部变量的引用是不合法的(会出现告警),但是可以返回一个静态变量的引用,示例代码如下:
int& func()
{int x;// 在编译时会产生告警return x;static int y;// 用法无误,因为x的作用域在函数外依然是有效的return y;
}
C++编程语言中引用(reference)介绍相关推荐
- php引用代码_PHP引用是什么?php中引用的介绍(代码实例)
本篇文章给大家带来的内容是关于PHP引用是什么?php中引用的介绍(代码实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1. 什么是引用 在 PHP 中引用是指用不同的名字访问 ...
- Java中各种引用(Reference)解析
目录 1,引用类型 2, FinalReference 2.1, Finalizer 3, SoftReference 4, WeakReference 5, PhantomReference 6, ...
- java byreference_Java中各种引用(Reference)解析
1,引用类型 java.lang.ref整体包结构 类型 对应类 特征 强引用 强引用的对象绝对不会被gc回收 软引用 SoftReference 如果物理内存充足则不会被gc回收,如果物理内存不充足 ...
- 编程语言中字面常量(literal)的详细介绍(关键词:Java,文字量,直接量,常量,常值,字面量,字面值,实字)
一.问题背景 博主在复习<Java疯狂讲义>第3章(数据类型和运算符)时,其中在3.2.3 Java关键字中提到了直接量的概念: 如上图所述,原文提到: TRUE. FALSE 和 NUL ...
- C++/C++11中引用的使用
引用(reference)是一种复合类型(compound type).引用为对象起了另外一个名字,引用类型引用(refer to)另外一种类型.通过将声明符写成&d的形式来定义引用类型,其中 ...
- java中date类型如何赋值_一文读懂java中的Reference和引用类型
简介 java中有值类型也有引用类型,引用类型一般是针对于java中对象来说的,今天介绍一下java中的引用类型.java为引用类型专门定义了一个类叫做Reference.Reference是跟jav ...
- 六、Go编程语言中的函数式编程
@Author:Runsen 任何编程语言都是众所周知的面向对象编程,还有日渐流行的函数式编程,当然Go也不例外,这也是本文的重点..我可以这么说,Go的功力深不深完全就是看函数式编程和面向对象编程. ...
- java reference 传引用_Java的引用(reference)---Roni
摘自<Java面向对象编程>一书,作者:孙卫琴 来源:www.javathinker.org 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说 ...
- JVM中引用计数法与可达性分析
目录 概要 如何判断对象已死? 引用计数算法 优点 缺点 举例说明 可达性分析 图例说明 GC Roots的对象包括以下几种 可达性分析回收过程 四大引用 回收方法区 方法区的垃圾收集主要回收两部分内 ...
- markdown中引用代码_如何在Markdown中引用您JavaScript源代码
markdown中引用代码 您是否撰写有关Javascript和Typescript的技术文章? (Do you write technical articles about Javascript a ...
最新文章
- 2018-3-25论文(Whale Optimizer Algorithm)+(Gery Wolf Optimizer)笔记二---Introduction 对比
- linux vi 清除所有,Vi命令:如何删除全部内容
- python安装lxml库出错_Python pip安装lxml出错的问题解决办法
- 使用pyjnius和mpxj来读取mpp文件
- 谷歌迈出量子计算开源第一步,推出首个量子机器学习库TensorFlow Quantum
- 数据库-优化-检查慢日志是否开启
- DDD(领域驱动设计)
- tplink迷你路由器中继模式_斐讯无线路由器设置无线中继(无线扩展)
- MySQL的常用SQL脚本
- 数据分析的一些简单思路总结
- linux+镜像命令在哪里,怎么查看 linux 镜像文件
- matlab2014b 迅雷,matlab 2014b下载
- 新安装IAR打开现有工程
- python中计算均方误差_Python中的均方根误差
- PHP未登录加入购物车,加入购物车 和 会员登录后 经常跳出 显示未登录
- (附源码)springboot民宿网站 毕业设计 221901
- 24速算c语言实训报告ppt,原创:C语言速算24数据结构课程设计最终版
- 基于小波变换的音频压缩
- 美国访问学者申请签证存款证明相关事宜
- 【学术】各类基金资助项目英文翻译(中英文对照)