【记3】引用的概念和本质
2018-05-29 本文已影响0人
CozyMoonquake
一、引用的概念。
引用没有定义,是一种关系型声明,声明它和原有某一变量(实体)的关系,故其类型与原类型保持一致,且不分配内存,与被引用的变量具有相同的地址。
在声明的时候必须初始化,一经声明,不可更改,以下的re已经声明了是a的引用,就不能再成为b的引用了。
另外,可对引用再次引用,多次引用的结果,即某一变量具有多个别名,以下的re和re1即都是a的别名。
因此,符号&前有数据类型时,表示引用,其它皆为取地址。在传递参数时,引用比指针更方便。
#include<iostream>
using namespace std;
int main(void)
{
int a=10;
int b=20;
int *p=&a;
*p=30;
p=&b;
*p=40;//改变的是b
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
int &re=a;//int & 是引用数据类型,re是a的别名
re=50;
cout<<"a="<<a<<endl;
re=b;//re不能成为b的引用
re=60;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
int &re1=re;
re1=70;
cout<<"a="<<a<<endl;
cout<<"re="<<re<<endl;
cout<<"re1="<<re1<<endl;
return 0;
}
二、引用的本质。
1、引用和指针占用的空间大小是相同的。
2、引用和常量一样,都必须要初始化。
由以上两点,引用实现的底层即是一个常指针,即
int &re=a;
等价于
int *const re=&a;
举例如下:
void change1(int *const a) //int *const a = main::&a
{
*a = 100;
}
void change2(int &a)//当我们将引用作为函数参数传递时,编译器会替我们将函数实参取地址给引用
//int &a = main::&a
{
a = 100; //对一个引用操作时,编译器替我们对隐藏*操作
}
总结,当我们去研究一个引用的时候,可以将其当做一个常指针来研究。但当我们使用引用来编程的时候,只需将其当做变量的一个别名即可,这样会方便许多,避免理解上的混乱。另外,引用作为返回值时,不要返回局部变量的引用,否则若会在外部对该引用再次进行引用时,由于局部变量的生命周期已随着函数的执行完毕而销毁,由此会造成不安全事件。以上问题解决方法可以使用static静态变量,此时的引用作为函数返回值时,可以在外部作为左值使用。