前言
本篇文章主要内容为C++中引用的介绍以及一些注意事项,本篇文章主要是个人的理解及心得,如有错误,望指正,谢谢
提示:以下是本篇文章正文内容,下面案例可供参考
一、引用是什么?
引用是C++中为了方便我们程序员更方便的操控数据而创作的一种另类与指针的东西。其通俗的说法就是给一个变量起了一个别名。
二、为什么需要引用?
在我们平时书写代码的时候,当我们要更改一个指针的时候,我们的方法无非就是套一层结构体或者是传二级指针来进行修改,这样长期的使用,让我们觉得非常繁琐,并且代码量也会增加,所以,引用就出现了。
三、引用的介绍
1.使用方法
在类型的后面加一个&就是引用的意思,这里给大家提醒一点,引用必须定义(初始化),也就是你一定要说明是给谁起的别名。
代码如下(示例):
#include<iostream>
using std::cout;
using std::endl;
int main()
{
int a = 1;
int& c= a; //a的别名c
cout << c << endl;
return 0;
}
2.引用的注意事项
1.悬空引用
引用在平时代码的使用中要比指针方便很多,并且效率也要高上一些,但是也有和指针相同的易错的地方,接下来我来给大家上个实例看看区别
代码如下(示例):
#include<iostream>
#include<time.h>
#include<Windows.h>
using std::cout;
using std::endl;
int& Funk()
{
int a = 1;
return a;
}
int Funk1()
{
int y = 2;
return y;
}
int main()
{
int& c= Funk();
cout << c << endl;
Funk1();
cout << c << endl;
return 0;
}
这里我写了一个无论是指针还是引用都可能发生的问题,当我们对数据进行使用时,首先要先看数据的内存是否还在它的生命周期内,上面我所写的程序由于出了函数的生命周期后,变量已经销毁了,也就是还给了操作系统了,而调用Funk1时使用的函数栈帧是复用了Funk的空间的,所以c变成了2. 这就是悬空引用,即访问一个不安全的空间。
3.常引用
直接上代码给大家看看,是否有什么错误
int main()
{
const int a = 1;
int& b = a;
return 0;
}
这里我们使用了const修饰a变量,使其具有常属性,但是我们知道,如果我们给a 一个引用b 那么我们就可以通过b来对a进行修改,但是这里的a具有常属性,是不能进行修改的,这里的本质就是权限放大,而权限只能平移和缩小,那么我们要怎么改正呢?
int main()
{
const int a = 1;
const int& b = a;
return 0;
}
这里我们只需要给引用加一个cont就行了,这样b也就有了常属性。
那么,我们再来看一个实例:
代码如下:
这个代码是否有问题?
int main()
{
int a = 1;
double b = a;
double& c = a;
return 0;
}
要想要看出这里的问题我们需要知道赋值运算时,我们是将a的值从int转变为double再赋值给b的吗?并不是,我们这里其实是将a进行了拷贝,将拷贝的值转换为double类型再赋值给b,那么看引用的那一行代码,当我们进行了对a的拷贝之后,拷贝的值是一个临时变量,就具有常属性,也就是一个右值,此时我们并不具备修改它的值的权限,所以无法使用引用。
总结
在关于引用和指针谁比较好用的这一方面来说,这两类是处于互补的关系,在修改参数方面引用比较好用,但是指针有着不可替代的作用,比如说在链表中我们如果想遍历链表,就必须使用指针,这里就没法使用引用,因为在c++中引用的对象是没法改变的。