引用 c++


前言

所谓引用,就是给变量起个小名,就像父母叫你乳名一样,两个不同的名字对应的是同一个人,对应的是同一份数据


一、使用步骤

1.引用的基本使用

代码如下(示例):

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a=100;
	                     //创建引用
	int &b=a;
	cout<<"a= "<<a<<endl;
	cout<<"b= "<<b<<endl;
	b=10;                 //这样修改啊数据是合法的
	cout<<"a= "<<a<<endl;
	cout<<"b= "<<b<<endl;
	return 0;
}

2.引用使用的注意事项

  1.  引用必须初始化,不然会报错
    
  2.  初始化后不能改变,但可以进行赋值操作
    

代码如下(示例):

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a=100;
	int b=90;
	//int &c;             错误必须初始化  
	int &c=a;   
	c=b;             //赋值合法 
	c=1000;			//赋值合法 
	cout<<"a= "<<a<<endl;
	cout<<"b= "<<b<<endl;
	cout<<"c= "<<c<<endl;
	return 0;
}

在这里插入图片描述

3.引用做函数参数

引用可以让形参修饰实参,达到指针的目的
优点:可以简化指针修改实参
代码如下(示例):

#include<bits/stdc++.h>
using namespace std;
//值传递
void swap1(int a,int b)
{
	int t=a;
	a=b;
	b=t;
 } 
 //地址传递 
 void swap2(int *a,int *b)
 {
 	int t=*a;
	*a=*b;
	*b=t;
 }
 void swap3(int &a,int &b)
 {
 	int t=a;
	a=b;
	b=t;
 }
int main()
{
	int a=100;
	int b=90;
	cout<<"main  a= "<<a<<endl;
	cout<<"main  b= "<<b<<endl;
	swap1(a,b);
	cout<<"swap1 a= "<<a<<endl;
	cout<<"swap1 b= "<<b<<endl;
	swap2(&a,&b);
	cout<<"swap2 a= "<<a<<endl;
	cout<<"swap2 b= "<<b<<endl;
	swap3(a,b);
	cout<<"swap3 a= "<<a<<endl;
	cout<<"swap3 b= "<<b<<endl;
	return 0;
}

在这里插入图片描述

由此可见引用和地址传递一样,可以对数据进行修改,只有值传递不行
swap3输出数据和原数据一样,是因为被反转两次,恢复原状了

4.引用可以做函数返回值

千万千万不要返回局部变量引用,局部变量在栈区,运行后被销毁,引用的东西没了,什么也返回不了
代码如下(示例):

#include<bits/stdc++.h>
using namespace std;
//返回局部变量引用 
int& test1()
{
	int a=100;
	return a;
}
//返回静态引用 
int& test2()
{
	static int a=100;//加一个 static,把数据放在全局区,在主程序执行完前不会被销毁 
	return a;
}
int main()
{
	int &b=test1();;
	cout<<"b= "<<b<<endl;//和指针一个尿性,编译器会保留一次,然后就被销毁 
	cout<<"b= "<<b<<endl;//所以第二次输出的时候是乱码 
	int & b2=test2();
	cout<<"b2= "<<b2<<endl;//原来使用这种方法解决的,太棒了吧! 
	cout<<"b2= "<<b2<<endl;
	test2()=1000;            //返回引用,函数可以当左值,就是函数可以在左边被赋值 
	cout<<"b2= "<<b2<<endl;
	cout<<"b2= "<<b2<<endl;
	return 0;
}

5.引用的本质

想必你们也看出来了
这跟指针就是一个妈生的!!!!!!!!!!!!!
本质就是c++内部实现的指针常量
代码如下(示例):

#include<bits/stdc++.h>
using namespace std;
//发现引用,转换为int* const ref_a = &a
void test3(int &ref)
{
	ref = 100;//ref是引用,转化为*ref = 100
}
int main()
{
	
	int a = 10;
	int &ref_a = a;//这一步,系统自动转换为int* const ref_a = &a;.这个地方的&是取址符。这也说明了引用不许初始化的原因。
	ref_a = 20;//系统内部发现ref_a是引用,自动帮助我们转化为*ref_a = 20;
	cout << "    a = " << a << endl;
	cout << "ref_a = " << ref_a << endl;
	test3(a);

}

6.常量引用

防止数据被修改

#include<bits/stdc++.h>
using namespace std;
void show(const int& v)
{
	//v=1000;
	cout<<v<<endl;
 } 
int main()
{
	//int &r=10    错误,因为引用需要合法空间
	//加入const 就行了,编译器优化代码 
	const int &r=10;
	//加入const后不能那个进行修改变量 
	int a=10;
	show(a); 
	return 0;	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值