C++引用做函数参数和函数的返回值是引用的几种情况

引用做函数参数

引用的内部实现,是常指针,所以引用其实是对指针做了一些限制,这种限制的意义是在某些应用场景中,使用引用具有更好的 实用性和可读性。具体讲,引用最常见的用处是在做函数参数的时候,对比指针做函数参数,比如:

指针做函数参数:

void myswap(int *a,int *b)
{
	int tmp=*a;
	*a=*b;
	*b=tmp;
}

引用做函数参数:

void myswap(int &a,int &b)
{
	int tmp=a;
	a=b;
	b=tmp;
}

从可读性上讲,指针需要 * 去改变内存空间的值,调用的时候实参需要取地址,而引用,这些工作编译器帮我们完成了。另外,指针做函数参数,如果不小心修改了形参的值,那么之后的操作就不是修改我们本来想修改的实参的值,比如:

void swap_(int *a,int *b)
{
	int tmp=*a,n=16;
	a=&n;//意外地
	*a=*b;
	*b=tmp;
}

所以为了避免这种意外,函数需要设计成下面的样子

void myswap(int * const a,int * const b);

这就是引用的本质,所以在c++中设计的引用是有实际需求的。C是在应用中逐步堆积起来的,而C++是专门针对应用需求设计出来的。

函数的返回值是引用
int getDouble(int a)
{
	int tmp=a*2;
	return tmp;
}

上面的函数里,返回的是一个临时变量的值,在函数调用结束的时候,会保存一份这个值的副本,把副本拷贝给主调函数,所以是没有问题的,但是主调函数如果是 int &n=getDouble(n),这样编译会报错,因为返回的只是一个值,是没有地址的。

/*******************************************************************************************************************************/

int& getDouble(int a)
{
      int tmp=a*2;
      return tmp;
}

上面函数返回了临时变量的一个引用,引用是这个变量的别名,此时就有两种情况 一种是用变量去接返回值,如下:

int a=10;
a=getDouble(a);

此时,a是有地址的,只是用返回值的一个副本去给变量a赋值,没有问题,而如果像下面的代码,用变量的引用去接返回值:

int a=10;
int &b=getDouble(a);

因为引用是一个地址的别名,而这个地址是临时的,在函数调用结束返回后,这个地址就被析构掉了。

如果返回的是静态或者全局的变量的引用,如下:

int& getTimes()    
{    
    static int t=0;    
    t++;    
    return t;    
} 

仍旧是用引用去接返回值,因为变量t的地址不是临时的栈区,所以函数调用结束时地址不会析构。

综上,使用指针一定要找到内存,没有内存,指针的存在是没有意义的,而引用是常量指针,所以使用引用也必须要找到内存地址,看内存是在哪个区分配的,何时产生,何时被析构掉,指向一个被析构掉的随机的地址的指针是没有意义的,绑定在一个被析构掉的随机的地址的引用也是没有意义的。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值