C++引用

定义:
c++新增的一种复合类型,是已定义变量的别名。例如:int & a = b; a是b的别名,二者完全等价,可以交替使用。
主要用途:
用作函数的参数。通过将引用变量作为函数参数,函数将使用原始的数据而非拷贝之后的,这样在对结构和类变量进行传递的时候,便不需要额外创建临时变量,增加开销。
创建引用:
int & a = b,a和b指向相同的内存单元,任意改变a或者b的值,二者都会同时变化。例如:a++,b也会加1。
引用和指针的区别:
①表示方式
②在对引用进行声明时,必须将其初始化,而不能像指针可以先声明再复制。引用一旦创建便和某个变量一直联系,不能像指针可以改变所指对象。
按值传递,按引用传递,按指针传递:
最常见的比较就是交换变量:

void swapv(int a,int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

void swapr(int & a, int & b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

void swapp(int * a, int * b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

//函数调用
int numa = 10;
int numb = 20;
swapv(numa,numb);           //交换失败
swapr(numa,numb);           //交换成功
swapp(&numa,&numb);         //交换成功

运行以上代码段,很清楚的得到结果,按引用传递和按指针传递都能达到效果,其主要原因就是按引用和按指针传递都是对原始数据进行操作,而按值传递,a和b是复制了numa和numb的新变量(重新开辟了内存空间),所以再进行交换操作会失败,这也是在传递类变量和结构变量推荐使用按引用传递和按值传递的原因,不会新增开销。
按引用传递和按指针传递都能达到要求,但是二者也存在区别:
①声明函数参数的方式不同。
②在按指针传递的交换函数中需要使用解引用操作符*,而按引用传递和按值传递的函数体完全一致。

const引用:
之所以有const的引用的存在,是因为有这样的使用情况:按引用传递可以节省开销,但是因为操作的是原始数据,很容易在函数中发生非预想的操作,而改变了原始值,要避免不改变原始数据而又想使用引用,就是const引用的作用。
函数声明:void sum(const int & a,const int & b);
优点:
①避免无意中修改原始数据
②能够处理const和非const实参,否则只能接受非const变量。
③能够正确生成和使用临时变量。主要意思是引用参数是const,在实参和形参不匹配的情况下回产生临时变量,其行为就和按值传递一致,为确保原始数据不变(也是使用const的目的),会使用临时变量存储值。
具体什么情况下会产生临时变量:
前提是引用参数是const
①实参类型正确,但不是左值。
左值:可被引用的数据对象(变量,数组元素,结构成员,引用和解除引用的指针)
非左值:常量,表达式
②实参类型不匹配,但可以转为正确的类型。

返回引用:
函数声明:int & sum(int & a, int & b);
int a = sum(int & a, int & b)
作用和按值传递一致,返回引用不会将返回值复制到一个临时位置,再传递给a。
需要注意的是(和指针一样),不能返回函数中止时不再存在的内存单元引用(临时引用)。

总结:
使用引用参数的主要原因:
①可以修改调用函数中的数据对象。
②可以有多个返回值
③传递引用而不是整个数据对象,可以提高程序的运行速度。
按值传递,按引用传递,按指针传递的一般使用情况:
数据对象小,一般为内置类型或小型结构,使用按值传递。
数据对象是数组,使用指针,并且将指针声明为const指针。
数据对象为较大的结构,按引用传递和指针传递都可以。
数据对象为类对象,使用const引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值