二、C++中的引用


前言

C++中的引用

一、C++引用的基本语法

简要说明

  • 作用:给变量起别名
  • 语法:数据类型 &别名 = 原名;(别名与原名的数据类型要一致)

代码示例

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	int& b = a;          //别名和原名的数据类型要一致
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	b = 100;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	system("pause");
	return 0;

}

<运行结果如下>

在这里插入图片描述


二、C++引用的注意事项

简要说明

  • 引用必须初始化
  • 引用一旦初始化,就不可以更改了

代码示例

代码如下(示例):

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	//1、引用必须初始化
	//int &b;     这是错误的,没有初始化
	int &b = a;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << endl;

    //2、引用后不能更改
	int c = 20;
	b = c;   //赋值操作,而不是更改引用

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

	system("pause");
	return 0;
}

<运行结果如下>
在这里插入图片描述


三、引用做函数参数

简要说明

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

代码示例

ps: 顺便复习一下函数的传递方法

1、值传递
#include <iostream>
using namespace std;

void mySwap01(int m, int n)
{
	cout << "m = " << m << endl;
	cout << "n = " << n << endl;
	cout << endl;

	int temp;
	temp = m;
	m = n;
	n = temp;

	cout << "m = " << m << endl;
	cout << "n = " << n << endl;
	cout << endl;
}

int main()
{
	int a, b;
	a = 10;
	b = 20;
	mySwap01(a, b);         //形参不能修饰实参,a和b的值没有交换

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

	system("pause");
	return 0;
}

运行结果如下:
在这里插入图片描述

2、地址传递
#include <iostream>
using namespace std;

void mySwap02(int* m, int* n)
{
	cout << "*m = " << *m << endl;
	cout << "*n = " << *n << endl;
	cout << endl;

	int temp;
	temp = *m;
	*m = *n;
	*n = temp;

	cout << "*m = " << *m << endl;
	cout << "*n = " << *n << endl;
	cout << endl;
}

int main()
{
	int a, b;
	a = 10;
	b = 20;
	mySwap02(&a, &b);         //形参能修饰实参

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

	system("pause");
	return 0;
}

运行结果如下:
在这里插入图片描述

3、引用传递
#include <iostream>
using namespace std;

void mySwap03(int &m, int &n)
{
	cout << "m = " << m << endl;
	cout << "n = " << n << endl;
	cout << endl;

	int temp;
	temp = m;
	m = n;
	n = temp;

	cout << "m = " << m << endl;
	cout << "n = " << n << endl;
	cout << endl;
}

int main()
{
	int a, b;
	a = 10;
	b = 20;
	mySwap03(a, b);         //形参能修饰实参

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

	system("pause");
	return 0;
}

运行结果如下:
在这里插入图片描述

<ps: 原名和别名可以一样>


四、引用做函数返回值

简要说明

  • 作用:引用是可以作为函数的返回值存在的
  • 注意: 不要返回局部变量的引用
  • 用法: 函数调用作为左值

代码示例

<栗子1>

#include <iostream>
using namespace std;

//1、不要返回局部变量的引用
int& test01()
{
	int a = 10;        //a为局部变量,存放在栈区
	return a;
}

//2、函数的调用可以作为左值
//int& test02()
//{
//	static int a = 10;     //a为静态变量,存放在全局区
//	return a;
//}

int main()
{
	int& ref1 = test01();
	cout << "ref1 = " << ref1 << endl;
	cout << "ref1 = " << ref1 << endl;

	/*int& ref2 = test02();
	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;
	cout << endl;
	test02() = 1000;
	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;*/

	system("pause");
	return 0;
}

<运行结果如下>

在这里插入图片描述第一次编译器做了保留,但从第二次开始就会出现乱码了。所以不能返回局部变量的引用。

<栗子2>

#include <iostream>
using namespace std;

1、不要返回局部变量的引用
//int& test01()
//{
//	int a = 10;        //a为局部变量,存放在栈区
//	return a;
//}

//2、函数的调用可以作为左值
int& test02()
{
	static int a = 10;     //a为静态变量,存放在全局区
	return a;
}

int main()
{
	/*int& ref1 = test01();
	cout << "ref1 = " << ref1 << endl;
	cout << "ref1 = " << ref1 << endl;*/

	int& ref2 = test02();
	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;
	cout << endl;
	test02() = 1000;    //即a = 1000;  若函数的返回值是引用,则这个函数调用可以作为左值
	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;

	system("pause");
	return 0;
}

<运行结果如下>

在这里插入图片描述


五、引用的本质

简要说明

  • 本质:引用的本质在C++内部实现是一个指针常量
  • 指针常量:指针指向不变,指向的值可以改变
  • 常量指针:常量值不变

代码示例

#include <iostream>
using namespace std;

//发现是指针,转化为 int* const ref = &a;
void func(int& ref)
{
	ref = 100;         //发现是引用,自动改为*ref = 100;
}

int main()
{
	int a = 10;
	int& ref = a;
	//自动转换为 int* const ref = &a; 指针指向不可改,这也能说明为什么引用不可更改。

	ref = 20;
	//内部发现是引用,自动改为*ref = 20;

	cout << "a = " << a << endl;
	cout << "ref = " << ref << endl;
	cout << endl;

	func(a);
	cout << "a = " << a << endl;
	cout << "ref = " << ref << endl;

	system("pause");
	return 0;

}

<运行结果如下>

在这里插入图片描述


六、常量引用

简要说明

  • 作用:常量引用主要用来修饰形参,防止误操作
  • 在函数形参列表中,可以加const修饰形参,防止形参改变实参

代码示例

<栗子1>

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	int& ref = 10;   //这样初始化是不合法的

	return 0;
}

那怎么改呢?

<栗子2>

#include <iostream>
using namespace std;

int main()
{
	//int a = 10;
	const int & ref = 10;   //这样就没错了
	//因为加上const之后,编译器将代码改为 int temp = 10; int& ref = temp;

	cout << "ref = " << ref << endl;
	system("pause");
	return 0;
}

<运行结果如下>

在这里插入图片描述

<栗子3>

如果给ref重新赋值呢

在这里插入图片描述
如图所示,显然是不对的。因为加了const, 所以为只读,不能改变ref的值

<栗子4>

#include <iostream>
using namespace std;

//打印数据函数
void showValue(const int& value)    //因为加了const,所以value为只读,
{                                   //不能更改value的值,以此来防止数据被改
	//value = 1000;        //->这一步是不对的                 
	cout << "value = " << value << endl;
}

int main()
{
	int a = 100;
	showValue(a);
	
	system("pause");
	return 0;
}

总结

  • C++推荐用引用技术,因为语法方便,引用的本质是指针常量,但是所有的指针操作编译器帮我们做了。
  • 在常量引用中,总的来说,利用const修饰形参,以防止实参数据被改
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值