博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++之引用
阅读量:4184 次
发布时间:2019-05-26

本文共 2092 字,大约阅读时间需要 6 分钟。

我们都知道,在c语言中,有传值和传址两种参数传递方式。

像传值这种方式无法通过修改形参来改变外部实参的值,而传址方式,要想通过形参改变实参的值,只能通过指针形式传递,但是指针使用不是很形象友好而且不安全,那么我们想有没有一种类型,可以像值一样传递,同时又达到指针的效果呢?

于是,我们引入了引用的概念。

引用:

引用不是新定义了一个变量,而是给已经存在的变量取了一个别名,编译器并不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

类型& 引用变量名(对象名)=引用实体;

注意:将&放在类型的后面不是取地址,而是引用的标记

void Funtest(){    int a = 10;    int& ra = a;    printf("%d\n",&a);    printf("%d\n",&ra);}

引用特征:

(1)引用在定义时必须初始化(必须先创建变量,才能引用)

(2)一个变量可以有多个引用

例:int a =10;int& ra =a;int& b =a;

(3)引用一旦一个实体后,不能再引用其他实体

由此,我们可知,引用变量的周期比实体的周期短

常引用:

常引用有三种情况:

(1)const修饰的变量:

const修饰的变量不能修改,所以不能直接用普通的int型将其引用

故应该:

例:const int b=10;const int& rb=b;

(2)普通常数:

对于普通常数,不能直接引用,否则相当于直接修改常数的值

故应该:

例:const int& c =30;

(3)不同类型引用:

double d=12.34;const int& rd=d;d=100;

以上可得,&d与&rd地址不同,说明rd不是对d进行引用,而是对编译器所给的rd的临时地址空间的引用,而该地址空间实质为常性。

故不同类型引用采用直接普通引用不行,必须加上“const”的引用,所以改变d的值,rd的值不会改变

故:整型变量只能进行整型引用—–即引用变量类型与实体类型必须一样

数组的引用:

数组的类型是其去掉变量名剩下的部分:

例:int a[10];//其数组的类型为int [10]

所以数组的引用如下:

例:int a[10];int(&ra)[10]=a;

而以下情况不能引用,因为int[10]与int[9]不是同一个类型

例:int a[10];int (&rra)[9]=a;

引用使用场景:

1:直接给某个变量取别名

2:使用引用变量作为函数参数

void Swap(int &left,int& right)//按照引用的方式接受函数参数时,会生成临时变量

3:引用变量作为函数返回值

int& Funtest(int& a){    return a;}

例:

int& Funtest(int& a){     int a=0;    a+=1;    return a;}  int main(){    int b=20;    int& rb=Funtest(b);    printf(“%d\n”,rb);    printf(“%d\n”,rb);    printf(“%d\n”,rb);}

当函数结束空间被释放 ,所以它的引用也会被释放 ,所以此时返回它的引用毫无意义

不能返回栈空间上的引用

且返回值如果是引用类型:返回值的生命周期一定要比函数的生命周期长。

至此,在c++中,我们所知道的函数参数传递方式共三种:传值,传址和传引用。

且三种函数参数传递方式效率

传引用<传址<传值

具体效率验证请看我的博客

引用在底层实现:

引用在底层被当做一个指针对待,

普通引用在底层所对应的指针类型是 类型* const指针

那么引用和指针有什么区别呢?

引用和指针的对比:

相同点:

底层的实现方式相同,都是按照指针的形式进行的

不同点:

1.引用在定义时必须进行初始化,指针没有要求且指针可以定义,引用定义不出来 2.指针可以指向多个变量,而引用一旦引用实体,就不能和其他实体结合  3.没有NULL引用,但是有NULL指针 4.sizeof(指针)始终是指地址*空间所占字节个数;而sizeof(引用)为引用类型的大小5.引用自++改变引用变量内容;指针自++改变指针指向         指针++:指针向后偏移一个类型大小        引用++:在其数值上加1  6.有多级指针,没有多级引用(int&& c=10:不是多级引用,而是右值引用)  7.指针需要手动寻址;引用通过编译器实现寻址8.引用比指针使用安全(引用不用判空)

例题:

void Swap(int& left,int& right){int tmp=left;left=right;right=tmp;} int main (){int a=10;int *p=NULL;Swap(a,*p)return 0;}

上述代码函数传参没问题,但是在函数内部因为相当于传指针,但是right传的是空指针的地址,所以导致系统崩溃无法运行。

转载地址:http://lvuoi.baihongyu.com/

你可能感兴趣的文章
HTML5学习之——HTML 5 服务器发送事件
查看>>
SVG学习之——HTML 页面中的 SVG
查看>>
mysql中用命令行复制表结构的方法
查看>>
hbase shell出现ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException
查看>>
解决Rhythmbox乱码
查看>>
豆瓣爱问共享资料插件发布啦
查看>>
kermit的安装和配置
查看>>
linux中cat命令使用详解
查看>>
java中的异常机制
查看>>
商务智能-基本方法-数据钻取
查看>>
C++程序员技术需求规划(发展方向)
查看>>
JNI
查看>>
199. Binary Tree Right Side View(Tree)
查看>>
230. Kth Smallest Element in a BST(Tree)
查看>>
Java复制文件的4种方式
查看>>
mysql的JDBC连接工具类
查看>>
利用多线程(用到原子类AtomicInteger)往数据库批量插入大量数据
查看>>
多个线程操作数组
查看>>
定长线程池的应用
查看>>
ArrayBlockingQueue的简单使用
查看>>