【C++基础】引用

文章详细介绍了C++中的引用概念,包括引用作为变量的别名,必须初始化且不可改变其指向,以及在函数参数和返回值中的应用。引用在函数调用时可以实现对实参的直接修改,避免了值传递的副本开销。同时,文章提到了返回局部变量引用的风险,并解释了为何不能返回局部变量引用的原因。
摘要由CSDN通过智能技术生成

【C++基础】引用

一、引用的基本使用

给变量别名
语法:数据类型 &别名 = 原名;
(别名与原名的地址相同,指向的值也是同一个)

通过别名修改值,原变量的值也会修改。

示例:

#include<iostream>
using namespace std;

void main()
{
	int a = 10;
	int& b = a;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << endl;
	
	b = 100;

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}

输出:
在这里插入图片描述
看看地址:
在这里插入图片描述
结果:
在这里插入图片描述
地址果然一样。

不知道这个别名图个啥。

二、引用注意事项

  • 引用必须初始化
  • 引用在初始化后,不可以改变(指不能改指向的地址,值还是可以改的)

示例:

1.引用必须初始化

不然报错
在这里插入图片描述

2.引用在初始化后,地址不能改

在这里插入图片描述

三、引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修改实参
优点:可以简化指针修改实参

示例:

#include<iostream>
using namespace std;

//1、值传递		不会修改实参
void function1(int a ,int b)
{
	a *= 3;
	b *= 3;
	cout << "function1 : a = " << a << "\tb = " << b << endl;
}

//2、地址传递	会修改实参
void function2(int* a, int* b)
{
	*a *= 3;
	*b *= 3;
	cout << "function2 : a = " << *a << "\tb = " << *b << endl;
}

//3、引用传递	会修改实参
void function3(int& a, int& b)
{
	a *= 3;
	b *= 3;
	cout << "function3 : a = " << a << "\tb = " << b << endl;
}

void main()
{
	int a = 11;
	int b = 22;

	cout << "传参前 : a = " << a << "\tb = " << b << endl;
	function1(a,b);
	cout << "传参后 : a = " << a << "\tb = " << b << endl;
	cout << endl;

	cout << "传参前 : a = " << a << "\tb = " << b << endl;
	function2(&a, &b);
	cout << "传参后 : a = " << a << "\tb = " << b << endl;
	cout << endl;

	cout << "传参前 : a = " << a << "\tb = " << b << endl;
	function3(a, b);
	cout << "传参后 : a = " << a << "\tb = " << b << endl;
	cout << endl;
}

输出:
在这里插入图片描述

四、引用做函数返回值

不要返回局部变量的引用

用法:函数调用作为左值

示例:

#include<iostream>
using namespace std;

//返回局部变量引用
int& function1(int a)	//形参在函数执行完后会被释放
{
	return a += 1;
}

//传地址变量引用
int& function2(int* a)	//地址作为传参,函数会修改实参
{
	return *a += 1;
}

//静态变量引用
int& function3()
{
	static int s = 10;	//静态变量,存放在全局区,全局区上的数据在程序运行结束后由系统释放
	return s;
}

void main()
{
	int a = 1;
	int& b = function1(a);
	cout << "function1:" << endl;
	cout << "\t" << b << endl;
	cout << "\t" << b << endl;

	int& c = function2(&a);
	cout << "function2:" << endl;
	cout << "\t" << c << endl;
	cout << "\t" << c << endl;

	int& s1 = function3();
	cout << "function3:" << endl;
	cout << "\t" << s1 << endl;
	cout << "\t" << s1 << endl;
}

输出:
在这里插入图片描述

疑问:

  1. 不使用引用为什么形参值可以传递出来?
  2. 直接cout引用函数会不会返回形参值?
示例5:
int function(int a)	//形参在函数执行完后会被释放
{
	return a+=1;
}

void main()
{
	int a = 1;
	int b = function(a);

	cout << "b = " << b << endl;

	cout <<"function(a):" << function(a) << endl;	
}

输出:
在这里插入图片描述

  1. 为什么b = 2 ?
    b是一个新的容器,用来存储函数传出来的形参的值,所以函数将形参销毁,并不影响b的值。 引用时(int& b = function(a)),b存储的是形参的地址,function(a)函数在运行完时,将形参的值销毁了,也就是吧b指向地址的值给销毁了。所以会引用不能传形参(局部变量同理)。
  2. 为什么function(a) = 2?
    可能在执行cout << function(a) << endl;function(a)的值被系统自行创建的一个新容器存储了。

又来一个疑问
为什么不能是执行cout << function(a) << endl;function(a)的形参未被销毁?

为了测试形参是否被销毁,将函数换成返回引用int& function(int a)其余代码不变:
示例:
在这里插入图片描述
输出:
在这里插入图片描述

通过查看输出判断:

  1. 如果使用 int b = function(a);来接受引用地址,b似乎会直接被赋予引用地址的值,也就是直接赋值2。
  2. 第二行function(a):-74305584,说明形参的值确定被销毁了(这就是不能引用局部变量的原因)。
  3. 第三行function(a):000000DA5836F510是形参的地址。

所以在示例5中执行cout << function(a) << endl;function(a)的值是被系统自行创建的一个新容器存储了。而不能是执行cout << function(a) << endl;function(a)的形参未被销毁

五、引用的本质

本质:一个指针常量

六、常量引用

修饰形参,防止函数通过形参修改实参。

示例:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值