C++57个入门知识点_07_ 引用的使用(变量起别名、引用使用变量初始化、引用关系一旦建立无法修改、引用作为函数参数使用、作为返回值时需要保证返回的值还在生命周期内、不存在二级引用,但有指针的引用)

本文深入探讨了C++中的引用概念,包括引用的初始化必须使用变量、常量引用、引用关系的不可变性以及引用在函数参数和返回值中的应用。通过示例代码展示了引用如何作为函数参数传递和作为返回值使用,并强调了引用作为返回值时的潜在风险。此外,还提及了指针引用可以替代二级指针,并提供了引用在指针交换中的应用案例。
摘要由CSDN通过智能技术生成

接上篇:C++57个入门知识点_06_ 什么是引用(需改变外部内容,用指针存在判断地址的问题、引用本质给外部内容起别名、fool(int& n) 外部函数:int& refN=n fool(refN/n)),本篇主要讲引用的使用。

总结:

  • 1.引用在定义时就必须初始化,不能用常量进行赋值,需要采用变量进行赋值;int& refN = n;
    对上句的理解:引用本质是变量的别名,变量是可以修改的,如果可以用常量赋值,那这个常量是不是就可以修改了?

  • 2.只有常量引用才可以使用常量进行初始化,如果想要对常量引用,可以使用const int& refN = 123;

  • 3.引用的关系一旦建立则无法修改

  • 4.引用的使用:
    (1)作为函数参数void fooRef(int& n){n = 6;} 引用时fooRef(n);
    (2)作为函数的返回值int& fooRtnRef() {int k = 3;return k;} int& refk = fooRtnRef();

  • 5.不存在二级引用,但可以使用指针的引用来替代二级指针

  • 引用既可以像指针一样使得修改立即生效(地址传递),又没有指针那么麻烦需要解引用、获取地址,使用方便。

1. 引用使用变量进行初始化

在上篇我们对引用赋值采用int& refN=n的形式,那是否可以直接采用int& refN=8进行赋值呢?

int main(int argc, char* argv[])
{
	int& refN = 5;
	return 0;
}

可以看到如下报警:非常量引用的初始值必须为左值
在这里插入图片描述
使用nullptr也是同样的效果

引用在定义时就必须初始化,不能用常量进行赋值,需要采用变量进行赋值;int& refN = n;
对上句的理解:引用本质是变量的别名,变量是可以修改的,如果可以用常量赋值,作为常量的别名,那这个常量是不是就可以修改了?

2. 常量引用使用常量进行初始化

如果需要指向常量呢?可以采用如下方法:const int& refN = 5;

只有常量引用才可以使用常量进行初始化,如果想要对常量引用,可以使用const int& refN = 123;

3.引用的关系一旦建立(别名关系),无法修改

下面的一段代码,使用refN = m;m改变的是引用关系,使refN成为m的别名,还是对refN进行赋值,修改了n的值呢?

#include <iostream>

int main(int argc, char* argv[])
{

	int n = 5;
	int m = 6;
	int& refN = n;
	refN = m;
	return 0;
}

运行结果:可以看到refN和n的值都发生了改变,当refN称为n的别名,就永远不会改变
在这里插入图片描述

4.引用的使用:函数参数、函数返回值


(1)最常见的用法作为函数参数 函数:void fooRef(int& n){n = 6;} 引用:fooRef(n);

(2)作为函数的返回值

#include <iostream>

int& fooRtnRef()
{
	int k = 3;
	return k;
}

int main(int argc, char* argv[])
{
	int& refK = fooRtnRef();
	refK = 123;
	return 0;
}

运行结果:k作为引用返回给refK ,refK = 123;实现的是改变refK 和函数中k值的作用,因此两个的值均从3变为123。
查看局部变量原内存地址内容的方法: 函数中的k作为内部值,可以使用内存进行查看,单步运行至函数体,得到k的地址,通过VS查看其地址内的值的变化
在这里插入图片描述
但是有一个安全隐患,函数外界改变函数内部局部变量值,函数一旦出了作用域,函数内部的局部变量应该清空释放,通过引用去改变的是一个已经释放控件的值,这个内存下的值可能已经分配给其他变量了,已经不属于k了,可能产生不可预料的结果。因此在将引用作为返回值是,需要保证返回的值还在生命周期内。

5.不存在二级引用


指针存在二级指针:int* p=(&n); int** pp=&p,但不存在二级引用,但可以使用指针的引用来替代二级指针,这样就可以少写一个指针

以下代码利用指针的引用实现了指针交换,之前我们可能会使用二级指针实现交换,通过引用就可以实现少写一个指针的目的。

#include <iostream>

//交换两个指针
void exchange(int*& n1, int*& n2)
{
	int*k = n1;
	n1 = n2;
	n2 = k;
	return;
}

int main(int argc, char* argv[])
{
	int n = 5;
	int m = 6;

	int* pN = &n;
	int* pM = &m;

	exchange(pN, pM);

	return 0;
}

运行结果:指针实现了交换
在这里插入图片描述
在这里插入图片描述

6. 学习视频地址:C++57个入门知识点_07_ 引用的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值