【C++相对于C的扩展】4.引用

目录

前言

一、引用的基本用法

二、引用的本质

三、 三种具体的引用场景

1.函数中的引用

2.指针的引用

3.常量引用

总结 


前言

  在C语言中,函数传递参数有值传递和地址传递两种类型。其中,地址传递采用的是指针。一般来说,指针带有*号,当代码逻辑较为复杂时,这种写法可读性比较差,而且不容易区分并理解。因此,C++多了一种策略——引用。

一、引用的基本用法

  首先,我们先来介绍一下引用的基本用法,慢慢揭开它的神秘面纱。

  引用相当于给变量起别名,通过别名改变数值,原变量的值也会改变。

#include<iostream>
using namespace std;

int main() {
	int a = 8;
	int& b = a;
	b = 4;
	cout << a<<endl;
	cout << b;
	return 0;
}

  运行结果如下:

  可以看到,当我们改变b的值时,a的值也会改变,这就相当于一个指针的作用 ,函数通过引用进行传参时,我们也可以把它看作是地址传递。我们再举个生活中的例子来加深一下理解。

  有个人长的很帅,他的名字叫做张三,但是他的妈妈觉得这个名字念起来不是很顺口,于是给他起了一个小名,叫做乐乐。于是,无论我们叫张三还是乐乐,都是指这个妈妈的宝贝儿子。她儿子变胖了,我们既可以说张三变胖了,也可以说乐乐变胖了。

  听完这个解释,大家心里是不是更清楚了呢?下面我们再来谈谈引用的本质以及一些更具体的用法。

二、引用的本质

  引用的本质是一个指针常量,int& b = a 相当于int*const b = a

  什么是指针常量?它的作用是什么呢?我们先来区分两个概念:常量指针和指针常量。 

  常量指针的形式举例: const int* p = a ; 它的意义是指针的指向可以修改,但指针指向的值不能修改。指针常量的形式举例: int* const p = a ; 它的意义是指针的指向不能修改,但指针指向的值可以修改。 看起来是不是很绕?是不是感觉很容易混淆?下面这种理解能帮助我们很好地记忆。

  一般的指针形式为 int* p ; 常量指针就是先写常量const再写指针int*,即 const int *p ; 指针常量就是先写指针 int* 在写常量const,即 int* const p ;如果 const后面是*p(*p表示取值),表示值不能改变,指向(地址)可以改变;如果const后面只有p(p表示指向的地址),表示指向(地址)不能改变,值可以改变。

#include<iostream>
using namespace std;

int main() {
	int a = 8;
	int* const b = &a;//int& b = a ;    引用的本质为一个指针常量
	*b = 4;
	cout << a<<endl;
	cout << *b;
	return 0;
}

  运行结果如下:

三、 三种具体的引用场景

  下面我们从三个角度介绍引用的具体使用以及一些注意事项:

  • 函数中的引用
  • 指针的应用
  • 常量引用 

1.函数中的引用

  函数中的引用是一种地址传递。引用可以作为函数的形参。

  示例代码如下:

#include<iostream>
using namespace std;

//函数引用,一种地址传递,相当于指针的作用
void change(int& a) {
	a = 8;
}

int main() {
	int a = 3;
	change(a);
	cout << a;
	return 0;
}

    运行结果如下:

  有一个需要注意的点,我们不能在函数中返回局部变量的引用,因为当我们调用完函数后,函数所使用的栈空间将被销毁,函数里局部变量的地址被释放,不能再使用。

2.指针的引用

  指针的引用相当于一个指向指针的一个常量指针,类似于一个二级指针。

  p是一个指针常量,可以通过p来改变指针q的指向。代码示例如下:

#include<iostream>
using namespace std;

int main() {
	int a=4;
	int* q = NULL;
	int*& p = q;
	p = &a;
	cout << *p<<endl;
	cout << *q;
	return 0;
}

  运行结果如下:

3.常量引用

   引用可以改变值,不能改变指向;常量引用既不能改变值,也不能改变指向。

  如果我们去改变值的话,编译器将会给我们报错。 

总结 

  总体上讲,引用的发明能够减少我们书写代码时候的复杂度,增加其可读性。如果您还觉得这篇文章不错的话,不如亲自动手去体验一下引用所带来的全新乐趣吧!学习过程虽然有些枯燥,但是请相信最后有所收获后心情一定是非常舒畅、非常开心的。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

边城仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值