ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

引用的使用场景--- 2021.9.6

2021-09-06 11:02:04  阅读:245  来源: 互联网

标签:func2 场景 函数 10 2021.9 局部变量 --- int 引用


上一讲链接:

C++中的数组引用、指针引用— 2021.9.2

引用的使用场景:

在日常的使用过程中,一般我们使用引用的场景分为两种情况,分别是引用作为函数的参数引用作为函数的返回值。接下来会一 一进行分析。

先上完整代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//1.引用作为函数参数
void func(int& a, int& b)
{
	int sum = a + b;
	cout << "sum=" << sum << endl;
}

void test01()
{
	int a = 10;
	int b = 20;
	func(a, b);
}
//2.引用作为函数的返回值
int& func2()
{
	int b = 10;//不要返回局部变量的引用
	int& p = b;
	return p;
}
int& func3()
{
	static int b = 10;
	return b;
}
void test02()
{
	int& q = func2();
	q = 100;
	cout << q << endl;

	func2() = 200;
	cout << q << endl;
	cout << "func2=" << func2() << endl;

	func3() = 100;
	cout << "func3()=" << func3() << endl;
}
int main()
{
	test01();
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

引用作为函数的参数:
一般我们在设计函数时,往往会带有该函数的入口参数,类似于C语言中的指针操作,只不过在C++中换成了引用。接下来具体代码分析:

void func(int& a, int& b)
{
	int sum = a + b;
	cout << "sum=" << sum << endl;
}

void test01()
{
	int a = 10;
	int b = 20;
	func(a, b);
}

我们还是按照老样子对代码逐一进行分析:
上述代码相对来说比较简单,首先我们定义了两个整型变量ab,然后设计了一个求和函数,传入func函数的入口参数为ab

func的入口参数分别是引用a和引用b,分别对传入该函数的入口参数的内存空间进行取别名操作,进而分别对该内存空间取值,并且进行求和,最终打印求和值sum返回。最终结果如下图:

在这里插入图片描述

int& func2()
{
	int b = 10;//不要返回局部变量的引用
	int& p = b;
	return p;
}

void test02()
{
	int& q = func2();
	q = 100;
	cout << q << endl;

	func2() = 200;
	cout << q << endl;

	cout << "func2=" << func2() << endl;
}

我们还是按照老样子对代码逐一进行分析:
如上所示,我们创建了一个函数func2,进入该函数,首先创建了一个整型变量b,并且取值为10。并且引用对b所在的内存空间取别名为p,并且最终返回该p。退出func2函数后,将引用p传递给引用q,并且通过q将内存空间b修改为100,最终进行打印。最终结果如下图所示:
在这里插入图片描述
看似是没有问题的,我们继续分析:

如果直接将200赋值给func2,然后依次打印p和func2()返回的值,结果会怎样呢?

在这里插入图片描述
我们通过上图会发现,正常情况下func2的返回值应该是200才对,可是为什么是10呢?其实我们上面编写的代码是错误的,只是编译器没有检测出来而已,因为func2中的变量b是局部变量,退出func2函数时,该局部变量所在的内存空间其实是已经不存在了,已经被销毁了。所以虽然上述结果看似是正确的,只不过是通过引用q来对func2所在的内存空间进行修改罢了。

那么我们如果要返回的是局部变量,并且要进行引用时,我们应该将局部变量置于堆区或者静态区,具体操作如下:

int& func3()
{
	static int b = 10;
	return b;
}

void test02()
{
	func3() = 100;//如果要函数当左值,那么该函数必须返回引用
	cout << "func3()=" << func3() << endl;
}

唯一和之前的代码有区别的在于我们将局部变量置于静态区,最终结果如下图:

在这里插入图片描述

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

标签:func2,场景,函数,10,2021.9,局部变量,---,int,引用
来源: https://blog.csdn.net/qq_40544107/article/details/120128166

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有