C++ 学习(十) 引用、引用作为参数与返回值、引用的本质、常量引用

C++ 引用

1、引用

引用本质是给变量起别名,引用必须初始化,且在初始化后不可以改变

语法:数据类型 &别名 = 原名;

#include<iostream>
using namespace std;

int main()
{
	//引用:给变量起别名
	int a = 5;
	//创建引用,引用必须要初始化
	int& b = a;

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

	//通过别名修改值
	b = 20;

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

	//引用初始化后不可改变
	//&b = 20; //报错:表达式必须是可修改的左值
	cout << "引用初始化后不可改变; &b = 20; //报错:表达式必须是可修改的左值" << endl;

	system("pause");

	return 0;
}

输出结果

a = 5
b = 5
a = 20
b = 20

引用初始化后不可改变; &b = 20; //报错:表达式必须是可修改的左值

2、引用作函数参数

引用作函数参数时,形参修饰实参,可以简化指针修改实参。

#include<iostream>
using namespace std;

void swap(int& p1, int& p2)
{
	int tmp = p1;
	p1 = p2;
	p2 = tmp;
}

int main()
{
	//引用:作为参数传递 - 形参修饰实参
	int a = 5;
	int b = 3;

	cout << "交换前 a = " << a <<  ", b = " << b << endl;

	swap(a, b);

	cout << "交换后 a = " << a << ", b = " << b << endl;

	system("pause");

	return 0;
}

输出结果

交换前 a = 5, b = 3
交换后 a = 3, b = 5

3、引用作函数返回值

引用作函数返回值时,不要返回局部变量引用,函数调用可以作为左值。

#include<iostream>
using namespace std;

//函数返回值为引用,返回局部变量出现的问题
int& f1()
{
	int a = 5;
	return a;
}

//返回静态变量引用
int& f2()
{
	static int a = 5;
	return a;
}

int main()
{
	//引用:作函数返回值时,不要返回局部变量引用,函数调用可以作为左值。

	//测试调用函数 - 返回局部变量的引用 
	int& result = f1();
	cout << "返回局部变量引用 result = " << result << endl;
	cout << "返回局部变量引用 result = " << result << endl;
	cout << "返回局部变量引用 result 值异常" << endl;

	//测试返回静态变量引用
	int& result2 = f2();
	cout << "返回静态变量引用 result2 = " << result2 << endl;
	cout << "返回静态变量引用 result2 = " << result2 << endl;
	cout << "返回静态变量引用 result2 值正常" << endl;

	//返回引用作为左值
	f2() = 27;
	cout << "返回引用的函数作为左值 result2 = " << result2 << endl;
	cout << "返回引用的函数作为左值,修改了引用变量 result2 值" << endl;

	system("pause");

	return 0;
}

输出结果

返回局部变量引用 result = -858993460
返回局部变量引用 result = -858993460
返回局部变量引用 result 值异常
返回静态变量引用 result2 = 5
返回静态变量引用 result2 = 5
返回静态变量引用 result2 值正常
返回引用的函数作为左值 result2 = 27
返回引用的函数作为左值,修改了引用变量 result2 值

4、引用的本质(指针常量)

在C++中,引用的本质内部实现是一个指针常量。指针常量可参见:C++ 学习(七)指针、const修饰指针、指针与数组、指针与函数_瘦身小蚂蚁的博客-CSDN博客

    int a = 5;
    int& b = a;  //自动转换为 int* const b = &a; 即为指针常量,指针常量指针指向不可修改,即引用初始化后不可修改,但是指针指向的值可以修改,即引用的值可以修改。

    b = 17; // 自动转换为 *b = 17; 修改指针指向的值,即修改引用的值。

5、常量引用

常量引用主要用来修饰形参,防止误操作。

语法: const 数据类型& 变量名 = 值;

const int& a = 5;

//编译器优化代码:int tmp = 5; const int& a = tmp; int& a = tmp;本质是一个指针常量,因此const int& a = tmp; 是const修饰指针又修饰常量,因此指针指向不可修改,指针指向的值也不可修改。
//a = 10; //常量引用不可修改
//&a = 10; //常量引用的值不可修改

#include<iostream>
using namespace std;

//常量引用使用场景:通常用来修饰形参,防止修改了引用形参修饰的实参
void print(const int& x)
{
	//x = 30; //防止修改引用形参
	cout << "常量引用 x = " << x << endl;
}

int main()
{
	//引用:常量引用
	//引用本身需要一个合法内存空间,以下写法会报错
	//int& a = 5; // 报错:非常量引用的初始值必须为左值

	//常量引用
	const int& a = 5; //编译器优化代码:int tmp = 5; const int& a = tmp;

	cout << "常量引用 a = " << a << endl;

	//a = 10; //常量引用不可修改
	//&a = 10; //常量引用的值不可修改

	//防止修改引用形参
	cout << "防止修改引用形参" << endl;
	print(a);

	system("pause");

	return 0;
}

输出结果

常量引用 a = 5
防止修改引用形参
常量引用 x = 5

Go语言中没有引用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值