C++ ——引用(上)

简介: 引用的知识比较繁琐,分为两部分来写

1.引用概念

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

对于引用的概念还是比较好理解的。引用的基本用法:

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

我们不妨来举个例子:

如何去应用我们的引用呢?我们以从开始就接触到的Swap()函数为例子,之前我们都是用指针去进行实现,现在我们可以用引用来实现:

交换的时候更加的方便,不需要进行解引用。

另外,有了引用,我们就可以对之前链表实现用到的二级指针进行改写了,使之看起来更加简便,我们只需要typedef一个指针,在对其进行引用即可:

我们可以发现,引用可以简化一些代码的实现,对于刚开始引用的概念我们就先说到这里,接着往后面走下去👇


2.引用特性

  • 引用在定义时必须初始化
  • 一个变量可以有多个引用
  • 引用一旦引用一个实体,再不能引用其他实体

我们来看第一个引用的特性,引用在定义时必须要初始化,如果没有初始化,我们来演示一下:

引用一旦引用一个实体,再不能引用其他实体 ,只是改变值而已,我们可以来举个例子,调试起来看一看:

我们可以看到,rra的地址还是a的地址,只是值变成了b值而已。

对于引用的特性而言,我们还是能够很好去理解的。


对于C++指针和引用而言,是相辅相成的。

下面,我们来看看引用的使用场景

3.使用场景

  • 做参数

  • 做返回值

那如果没有static进行修饰呢?会出现什么问题❓

有static是把变量放在了静态区,出了函数不会销毁。而没有static的时候,空间销毁了

空间销毁意味着什么

首先,空间销毁后空间还是在的,只是使用权不是我们的了,我们存的数据不再被保护。

我们可以去进行访问,只是读写的数据是不确定的。

我们在来看另一个代码:

我们可以发现,在第三行中出现了随机值。为什么会出现❓

第三行出现随机值的原因是因为cout也是一个函数,会进行函数调用。因为第一次cout调用取参数ret没被改还是1,后面cout调用的时候被覆盖了,所以成为了随机值。第三次调用Func(),使之成为了100。

实际上,我们上面都是在讨论一个不太合适的程序,函数返回值是引用,语法上没有报错,但是运行结果却是不确定的。

所以,在这里,我们需要注意到一个点

注意:如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回

也就是说,出了函数作用域,返回变量不存在了,不能用引用返回,因为引用返回的结果是未定义的。如果出了函数作用域,返回变量存在,才能用引用返回。

所以,下面才是正确的(这里的差别在于static的修饰):

到了这里,问题就来了,对于值、引用作为返回值类型究竟有什么区别呢❓

该怎么去选择呢👇


4.值和引用作为返回值类型

对于传引用做返回值类型:

  • 减少拷贝,提高效率
  • 修改返回值
  • 引用做参数

我们可以来测试一下效率究竟是如何的:

我们可以明显看到,引用的效率确实是提高了。

除此之外,引用也可以作为参数,也可以修改返回值。

相关文章
|
29天前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
40 9
|
1月前
|
存储 安全 编译器
【C++专栏】C++入门 | 函数重载、引用、内联函数
【C++专栏】C++入门 | 函数重载、引用、内联函数
27 0
|
1月前
|
存储 分布式计算 安全
我的C++奇迹之旅:值和引用的本质效率与性能比较2
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
1月前
|
编译器 C++
我的C++奇迹之旅:值和引用的本质效率与性能比较1
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
2月前
|
安全 编译器 Linux
【C++练级之路】【Lv.1】C++,启动!(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for,nullptr)
【C++练级之路】【Lv.1】C++,启动!(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for,nullptr)
|
2月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
69 0
|
11天前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
2月前
|
设计模式 算法 数据安全/隐私保护
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
27 0
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
|
2天前
|
存储 安全 C++
深入理解C++中的指针与引用
深入理解C++中的指针与引用
5 0
|
11天前
|
编译器 C语言 C++
【C++入门】缺省参数、函数重载与引用(上)
【C++入门】缺省参数、函数重载与引用