C++基础之——引用

引用

参数值与引用

先前我们学习过两种参数传递的方式:第一种为值传递,第二种为地址传递。接下来我们来学习一个新知识:引用,什么是引用呢?总的来说就是给变量起别名。

引用作为函数参数时的原因:

* 在函数内部会对此参数进行修改

* 提高函数调用和运行效率

在函数调用时,值传递为将实参拷贝到形参。而引用则不需拷贝,引用已具有实参值的信息,节省了值拷贝的时间,和空间的消耗,当程序对时间成本有要求时,非常必要。

下面用交换函数swap来掩饰三种函数的参数传递:

#incldue<iostream>
using namespace std;

void swap1(int a,int b){    //值传递,函数中形参不能对实参进行修改
int temp = a;
a = b;
b = temp;
}

void swap2(int* a,int* b){    //地址传递,通过传入地址,基于地址对实参的值进行修改
int temp = *a;
*a = *b;
*b = temp;
}

void swap3(int &a,int &b){    //引用传递,通过起别名,对实参的值进行修改
int temp = a;
a = b;
b = temp;
}

int main{
int a = 10;
int b = 10;
swap1(a,b);//不能交换
swap2(&a,&b);//能交换
swap3(a,b);//能交换
return 0;
}

返回值与引用

* 返回值为引用的好处:在内存中不产生返回值的副本。

当返回值不为引用时,由于函数中的形参为局部变量,当函数结束之后会被释放,所以在传值的过程中形参会产生一个副本,传递到实参中。

而当返回值为引用,虽然函数中形参为局部变量函数结束之后被释放,但是由于返回值为引用即为“起别名”,所以不需产生副本就可以直接将值传递到实参中。

int fun1(int a){    //形参,局部变量,a存放到栈区,函数结束之后a被释放,产生副本传递到实参
a += 2;
return a;
}

int &fun2(int a){   //形参,局部变量,函数结束a释放,引用起别名fun2,不产生副本直接将数值传递
a += 2;
return a;
}

引用和指针的区别:

* 引用在定义时必须被初始化(底层为指针)并且不能被初始化成NULL,指针没有要求。

int a = 10; //b 初始化了,无错误
int &b = a;

int a = 10; //b 未初始化,有错误
int &b;
b = a;

* 引用不能改变引用关系,指针随意。指针:改变指向方向即可,引用:不论怎么修改都是改变最初关系的值。

int a = 10;
int b = 11;
int &c = a;
c = b;
b = 12;
c = 13;
cout<< a << " " << b << " " << c <<endl;//不论怎么改变b的值,c的值永远和a相同,输出13 12 13

* 有多级指针没有多级引用

* 引用++和指针++表达的含义不同。指针自增是在指针上的计算(sizeof(int) * 4或者8),引用自增单纯加一

* 指针用sizeof计算大小结果不同,32位内存下是4字节,64位内存下是8字节,引用结果取决于类型的大小。

* 指针是一个实体,需分配内存空间;引用知识变量的别名,不需要分配内存空间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Coke_3.2.2

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

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

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

打赏作者

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

抵扣说明:

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

余额充值