C++【const 引用】详解

【const引用】详解

  • 一、什么是引用
  • 二、引用“特性”
  • 三、使用场景
    • 3.1做参数(输出型参数)
    • 3.1做返回值
  • 四、const+引用
    • 4.1 引用的权限问题⚠️
    • 4.2 常引用(重点)⚠️
  • 五、指针和引用的区别

C++【const 引用】详解_第1张图片

今天大年初四了,给大家拜个晚年!‍♂️‍♂️
祝愿各位2023年结交更多同步共振的朋友,处于一起进步、同时加油的正能量场中。
祝福各位2023年步步为营,学到新技能、拓展新领域;
祝福大家2023年学业进步、升职加薪、能力提升;
祝愿大家过好当下每一天,做幸福生活的人生赢家;
相信大家都希望自己能有美好生活,都有向善向上之心;拥有让自己美好生活的能力;

本文是C++开篇之作,希望大家多多支持,关注、点赞+评论!!!

一、什么是引用

C++【const 引用】详解_第2张图片

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
比如:蔡某某,可以称为"鸡哥",或者称为"鲲鲲"

二、引用“特性”

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体
void Test2()
{
	int a = 10;
	// int& ra; // 该条语句编译时会出错,没有进行初始化
	int& Sa = a;
	int& SSa = a;
	printf("%p %p %p\n", &a, &Sa, &SSa);

	int b = 20;
	//是引用还是赋值??
	Sa = b;
	printf("%p %p %p\n", &a, &Sa, &b);
	printf("%d\n",a);
}

通过上述代码我们来简单讲述一下引用的第三条特性:Sa本来是变量a的引用,但是后来我们把变量b赋给它,那么Sa会变成b的引用吗?运行代码后可以发现,Sa的地址和a的地址一样,并没有被改变,所以Sa=b相当于把b赋值给Sa,Sa本来是10,现在被改成了20。
在这里插入图片描述

三、使用场景

3.1做参数(输出型参数)

函数中修改形参,实参也改变了

void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}

3.1做返回值

int Count1()//传值返回
{
	int n = 0;
	n++;
	// ...
	return n;
}

int& Count2()//引用返回
{
	static int n = 0;
	n++;
	// ...
	return n;
}

结论:出了函数作用域,返回变量不存在了(不加static的情况),不能用引用返回,因为引用返回的结果是未定义的。
出了函数作用域,返回变量仍然存在,可以用引用返回

四、const+引用

4.1 引用的权限问题⚠️

通常情况下引用要和const结合使用,接下来我们分析一下为什么?

	int a = 0;
	// 权限平移
	int& ra = a;

	// 指针和引用赋值中,权限可以缩小,但是不能放大
	
	const int b = 1;
	// rb引用b,b只有可读权限,rb可读可写,权限放大,不允许
	//int& rb = b;
	// 权限平移
	const int& rb = b;
	
	// rra引用a,权限缩小了,允许
	const int& rra = a;

	

假设有一个引用做参数的函数,那么当我们调用此函数的时候,传参就会受限制

//修改前
//void Count(int& s)
//{

//}
//修改后
void Count(const int& s)
{

}
int main{
	//...上述代码
	Count(a);//可以
	Count(b);//不可以,传参时候b的权限扩大了
	Count(rra);//不可以,同上
}

这种情况,我们就要考虑在形参加一个const修饰一下,加上const之后,a权限缩小,被允许,b和rra权限平移也可以。

4.2 常引用(重点)⚠️

int Count()//传值返回
{
	int n = 0;
	n++;
	return n;
}
int main()
{
	const int& b = 10;//可以引用常量,即上述函数传参也可以用Count(10)

	double d = 12.34;

	

	int i = (int)d; // 可以

	//int& rd = d; // 不可以

	const int& rd = d; // 可以
	cout << rd << endl;//12
	
	//传值返回测试
	//int& ret = Count();错误
	const int& ret = Count();

	return 0;
}

当int& rd = d; 会发生报错,那么原因是什么呢?是类型不匹配吗?还是其他的原因,我们来分析一下。。。

当发生类型转化的时候,都会产生一个临时变量(传值返回也是),临时变量具有常性,不能修改,这就导致rd在引用d的时候并不是引用d本身,而是d的临时变量,所以要加上const
C++【const 引用】详解_第3张图片

五、指针和引用的区别

在语法上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间,但是在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。这就像鱼香肉丝没有鱼,夫妻肺片不是用肺做的。

你可能感兴趣的:(C++,c++,开发语言)