返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中引用的相关知识点小结
  • 725
分享到

C++中引用的相关知识点小结

2024-04-02 19:04:59 725人浏览 泡泡鱼
摘要

目录引用的概念引用特性常引用使用场景引用和指针的区别总结引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块

引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。那么这里的“铁牛”、“黑旋风”就称李逵的引用。

在程序中呢,引用的用法如下:

类型& 引用变量名(对象名) = 引用实体;

举个例子:

void TestRef()
{
	int a = 10;
	int& ra = a;//<====定义引用类型
	printf("%p\n", &a); //打印出a的地址
	printf("%p\n", &ra); //打印出ra的地址
}

结果如下:

其中ra为a的引用,可见 a 和 ra 的地址一样,这就说明了变量与变量的引用公用的一块内存空间。

特别注意:引用类型必须和引用实体是同种类型的

引用特性

1. 引用在定义时必须初始化

2. 一个变量可以有多个引用

3. 引用一旦引用一个实体,再不能引用其他实体

例如:

void TestRef()
{
	int a = 10;
	// int& ra; // 该条语句编译时会出错,因为没有初始化
	int& ra = a;
	int& rra = a;
	printf("%p %p %p\n", &a, &ra, &rra);
}

知道引用的特性后,我们就可以简化在C语言中一些简单函数的写法,如交换两个数,可直接传变量的引用为参数来实现,具体如下:

可见当传入的参数为变量的引用时,就可以避免在次开辟内存空间,一定程度上提高了代码运行效率。

常引用

所谓常引用就是在一个变量的引用前加一个关键字 const 来使这个引用具有常量的性质。

如下所示:

void TestConstRef()
{
const int a = 10;
//int& ra = a; // 该语句编译时会出错,因为a为常量,而ra为变量(由&前面的类型决定,为int变量类型)
const int& ra = a;
// int& b = 10; // 该语句编译时会出错,b为常量
const int& b = 10;
double d = 12.34;
//int& rd = d; // 该语句编译时会出错,类型不同
const int& rd = d;
}

再例如:

int main()
{
	int i = 10;
	double d = i;
	//double& r=i; //这里编译器会报错,具体原因如下图示
	const double& r = i; //加上const 修饰就会使引用具有常性
    return 0;
}

所以只有在定义引用前加上const 修饰就能使之具有常性。

另外要注意使用const引用时的权限问题,例如:

#include<iOStream>
using namespace std;
int main()
{
	// 使用常变量时变成常变量的别名的条件:不变或者缩小常变量的读写权限是可以的,
	//放大你常变量读写权限不行的
	const int a = 10;
	// int& b = a;  // 不能这样定义b,这样会使a的权限变大,编译器会报错

	int c = 20;
	const int& d = c; // 可以这样定义,d变成的c的别名,d不能修改c,相当于把c的权限缩小
                      //其中c是可以改变的,但是d只能读不能写
	return 0;
}

如上解释一下:并不是每个别名(即引用)都跟原名字有一样的权限,具体要看怎么修饰。

使用场景

1、做参数

void Swap(int& left, int& right)
{
  int temp = left;
  left = right;
  right = temp;
}

这里提一下引用做参数的优点:

1、 传引用是为了减少传值传参时的拷贝

2、使用const修饰引用时可以保护形参不会被改变

3、const引用做参数时,即可接收变量,也可以接收常量
 

总的来说,函数传参如果想减少拷贝就用引用传参,如果函数中不改变这个参数最好用const 引用传参

2、做返回值

看如下栗子:

为什么打印出的 ret=7 呢?

这是因为函数的返回类型为 int& ,所以返回值 c 的类型就是 int&,而 ret 作为接收函数的返回值的量,也为 int& 型,所以在这里就可以把 ret 看做是 c 的别名,当程序来到 Add(3,4); 这条语句时,返回值 c 就变为了 7,所以此时的 ret 的值也就为7。

以上也说明了使用引用做返回值会有一定的风险性。

引用和指针的区别

最后来总结一下引用与指针的区别。

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

来看这样一段代码:

int main()
{
	int a = 10;
	int& ra = a;
	ra = 20;
	int* pa = &a;
	*pa = 20;
	return 0;
}

再查看其汇编代码,会发现引用与指针的实现方式是一样的。

引用与指针的不同点:

1.引用在定义时必须初始化,指针没有要求

2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体

3. 没有NULL引用,但有NULL指针

4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)

5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

6. 有多级指针,但是没有多级引用

7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

8. 引用比指针使用起来相对更安全(因为指针使用不慎就会造成野指针)

总结

到此这篇关于c++中引用的相关知识点的文章就介绍到这了,更多相关C++中引用知识点内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++中引用的相关知识点小结

本文链接: https://lsjlt.com/news/141057.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中引用的相关知识点小结
    目录引用的概念引用特性常引用使用场景引用和指针的区别总结引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块...
    99+
    2024-04-02
  • HTML相关知识点总结
    目录简介HTML文档和网页的关系呢?HTML的标签样子?HTML基本概念标签元素属性注释编码规则HTML常用元素标题段落链接跳转页面:跳转锚点图片列表有序列表无序列表定义列表表格块表...
    99+
    2024-04-02
  • Java中的枚举相关知识点总结
    这篇文章主要讲解了“Java中的枚举相关知识点总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的枚举相关知识点总结”吧!Java中的枚举枚举通常是一组相关的常量集合,其他编程语言...
    99+
    2023-06-15
  • Java基础之引用相关知识总结
    目录一、引用的定义二、问题三、引用的分类四、应用场景五、源码六、总结一、引用的定义 在JDK 1.2以前,Java中的引用定义很传统:如果reference类型的数据存储的数值代表的...
    99+
    2024-04-02
  • Redis 事务知识点相关总结
    目录01 事务简介02 命令错误导致的事务提交失败,所有命令都不执行03 运行时错误导致数据错误04 丢弃事务05 watch命令06 总结Redis中的事务介绍  &nb...
    99+
    2024-04-02
  • Java中的引用知识点总结
    本篇内容介绍了“Java中的引用知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!强引用:默认情况下,对象采用的均为强引用(这个对象的...
    99+
    2023-06-05
  • MySQL索引的相关知识点有哪些
    本篇内容介绍了“MySQL索引的相关知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!索引介绍索引...
    99+
    2024-04-02
  • Java中类与对象的相关知识点总结
    目录一、面向过程与面向对象的理解二、类与对象的理解与认识三、类的成员1.字段/属性/成员变量2.对null的基本认识3.方法 (method)4.static 关键字四、封装1. p...
    99+
    2024-04-02
  • 云服务器相关知识点总结
    云服务器是一种虚拟的、服务器化的服务,可以提供按需使用、按量计费的服务,可以实现弹性扩展、自动负载均衡、快速响应、高可靠性等一系列功能,是许多企业和开发者的重要选择。以下是一些云服务器相关的知识点总结: 什么是云服务器:云服务器是一种通...
    99+
    2023-10-26
    知识点 服务器
  • MySql 存储引擎和索引相关知识总结
    存储引擎 什么是数据库存储引擎? 数据库引擎是数据库底层软件组件,不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能,使用不同的数据库引擎,可以获得特定的功能 如何查看引擎? --如何查看数据库支持的引...
    99+
    2022-05-11
    MySql 存储引擎 MySql 索引 MySql 存储引擎和索引
  • mysql中的键和索引相关知识点有哪些
    本篇内容介绍了“mysql中的键和索引相关知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、主...
    99+
    2024-04-02
  • mysql中关于覆盖索引的知识点总结
    如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引'。 覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据,有以下优点: 索引项通常比记录要小,所以MySQL访问更少的数据...
    99+
    2022-05-17
    mysql 覆盖索引
  • mysql中null(IFNULL,COALESCE和NULLIF)相关知识点总结
    本文实例讲述了mysql中null(IFNULL,COALESCE和NULLIF)相关知识点。分享给大家供大家参考,具体如下: 在MySQL中,NULL值表示一个未知值,它不同于0或空字符串'',并且不等于...
    99+
    2024-04-02
  • C++中引用的知识点有哪些
    本篇内容主要讲解“C++中引用的知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中引用的知识点有哪些”吧!引用的概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不...
    99+
    2023-06-29
  • MySQL 锁的相关知识总结
    MySQL中的锁 锁是为了解决并发环境下资源竞争的手段,其中乐观并发控制,悲观并发控制和多版本并发控制是数据库并发控制主要采用的技术手段(具体可见我之前的文章),而MySQL中的锁就是其中的悲观并发控制。 MySQ...
    99+
    2022-05-14
    MySQL
  • C#中面向对象的相关知识点有哪些
    本篇内容介绍了“C#中面向对象的相关知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!switch和字典前文提到过,有个游戏里面有个...
    99+
    2023-07-05
  • SwiftUI中@ViewBuilder的相关知识点解密
    前言 在SwiftUI框架中使用很多的注解,虽然使语法看上去非常简洁,但是增加了初学者的理解难度,这篇文章我们来看一下@ViewBuilder的相关知识。主要包括以下内容: ...
    99+
    2024-04-02
  • C#泛型集合的相关知识点整理
    这篇文章主要讲解了“C#泛型集合的相关知识点整理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型集合的相关知识点整理”吧!为什么要用C#泛型集合?在C# 2.0之前,主要可以通过两种方...
    99+
    2023-06-17
  • HTML5拖拽的相关知识点
    本篇内容主要讲解“HTML5拖拽的相关知识点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5拖拽的相关知识点”吧!拖拽相关属性draggable属性是h...
    99+
    2024-04-02
  • JavaScript垃圾回收器的相关知识点总结
    本篇内容介绍了“JavaScript垃圾回收器的相关知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作