返回局部变量的引用

int& func()
{
	int m=9;
	return m;
}
void test()
{
	int a  = 19;
	return ;
}
int main()
{
	int& fp=func();
	test();
	cout<<fp<<endl;
	return 0;
}
引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。
C++包含一个与指针有关的特性,称为“引用”。实际上,引用是一个隐含的指针。使用引用的方式有三种:作为函数参数,作为函数的返回值,或作为单个引用。

一、引用参数
默认时,C++使用按值调用,但是它提供了两种方法来得到按引用调用的参数传递。
首先,可以显式地把一个指针传递给变元。第二,可以使用引用参数。创建一个引用参数,在参数的名字前加上&即可。从技术上讲,i是一个隐含的指针。通常,当把一个值赋给一个引用时,实际上是把改值赋给引用所指的变量。

二、向对象传递引用
当对象作为变元传递给函数是,就创建了该对象的一个副本。当函数结束时,要调用副本的析构函数。然而,通过引用传递时,不创建对象的副本。意味着当函数结束时,没有作为参数的对象被撤销,也不调用参数的析构函数。
通过引用传递最小的对象以外的所有对象要比按值传递它们要快。变元通常传递到堆栈上。因此,要把大对象推进堆栈或从堆栈中弹出,需要花费相当多的CPU周期。
C/C++的函数参数是传值的,如果有大对象(例如一个大的结构)需要作为参数传递的时候,以前的(C语言中)方案往往是指针,因为这样可以避免将整个对象全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择,就是引用。 

三、返回引用
函数可以返回引用
char &replace(int i){ return s[i];}
引用作为返回值的时候,有一些规则必须遵守。这些规则包括: 
  不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态。 
  不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。 
  可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。 


四、独立引用
当创建独立引用时,创建的只是对象的另一个名字,相当于别名(绰号)。所有的独立引用必须在创建时初始化。除初始化以外,用户不能改变引用变量所指的对象。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值