在c++中,我们除了可以通过指针的方式访问变量,这里其实还有一种方式可以达到这种目的----引用。
引用其实就相当于直接给一个变量起一个别名,就像人可以直接通过大名称呼,也可以通过小名称呼。在C++中,我们该如何创建一个引用呢?其实和简单,语法是:数据类型 &别名=原名,如下:
int a=10;
int &b=a;//引用
在使用的过程中,我们既可以用a来访问这个数据10,也可以用b来访问这个数据,无论是在传参中还是在cout中打印,这个a和b的作用其实差不多,同样,我们也可以直接修改b的值,来修改a的值,这两个名字形容的是一个相同的内存空间。
一、注意事项
1、这两个变量直接其实还是有很多差异的,你比如说我们在初始化的时候,a可以直接声明,而这个b他并不可以这样,b在声明的同时一定需要我们对其赋值;如下:
int &b=a;
2、 我们在使用引用的时候,我们的引用变量是无法被更改的。当然这里的“更改”并不是我们去更改b所指向空间的数据,而是说这个b一旦修饰了a这个变量,就不能更改为其他变量了。就比如说一个人叫张三,我们可以叫他小张,但是我们不能叫李四小张,大概就是这个意思。
3、 在函数传参的方面,引用变量其实挺方便的。我们都知道,函数传参分为两个方面,值传递和地址传递,而现在又多了一个引用传递。我们在使用引用进行传递的时候,传进去的参数其实是可以修改的,这个功能其实就类似于指针,其变量内部的数据的修改是可以同步到我们的实参上面的,当然按照上述,引用的修饰对象不可修改。说了这么多,以下是代码:
void func(int &a)
{
}
int main()
{
int a=10;
func(a);
return 0;
}
4、引用可以作为函数返回值进行返回,但是我们不能返回局部变量的引用。这是什么意思呢,其实很简单,函数内部所定义的变量,在前面的文章中,我们知道是存放在栈区当中的,在函数运行完之后引用所指向的变量也随之释放,所以不能返回局部变量的引用。而当我们函数内部的变量并不是存放在栈区而是静态区呢?这里我们的函数就可以正常返回这个引用,具体如下:
int& func()
{
static int a=10;
return a;
}
这里的a是可以作为返回值,被我们main函数所接收。注意,这里函数的类型变成了int&,
同样下面的代码就是错误的了
int& func()
{
int a=20;
return a;
}
这里的a是接收不到的。
二、引用的本质
其实读到这里,我们其实不难理解,引用的本质其实就是指针常量。你比如说:
int a=10;
int &ret=a;
当我们写出这样的代码之后,编译器发现这是引用,表面是这样定义,实际上编译器转化为了
int *const ret=a;
到这里上面的关于引用不可改的描述就好理解了,正是因为有const修饰,我们的ret只能指向a,不能指向其他的变量,但是a所表示的数据是可以修改的,当我们将a的值改成了20,那么ret的值也会相应改为20。
三、常量引用
当我们传参的时候如果传输的参数是一个引用,为了防止它的值改变,我们也可以在传参的时候加一个const进行修饰,来达到目的。
void func(const int&a)
{
}
通过上述,引用在c++中其实还是很方便的,他本质是一个指针,虽然不可以修改其指向,但是仍然可以达到指针对应的功能,在使用时,我们也只需要将其视为一个变量的别名就可以使用了,其他指针相关的操作,便由编译器进行完成。
好了,以上就是这篇文章的全部内容了,这是我作为一个编程萌新的一些拙见,如果有哪里不对的地方欢迎各位大佬们指正。