c++函数返回值与引用
来源:互联网 发布:淘宝小二介入怎么撤销 编辑:程序博客网 时间:2024/06/05 02:33
对于函数的返回值,看似简单,但并非如此,比如:
int func(int a);该函数会返回一个int型,如果进行一个调用int result=func(3);会发生什么情况?
首先,func将返回值复制到一个匿名临时变量中,在这里假设该临时变量为anony(其实是没有名字的,这里方便阐述);然后,再将anony的值复制到result,可以看出,这里是进行了两次复制的。而并非一次复制。
对于返回引用的函数:
int & func(int &a);假设该函数传入一个int的引用,然后再func中修改它,再返回其引用,如果调用int reslut=func(b);会发生如下情况:
返回的是b的引用,因此相当于直接将b的值复制给了result。这里就只有一次复制(少了临时变量的复制,当然也创建了一个临时变量,只是该临时变量是b的一个引用)。
需要特别注意的是,按很多人的理解,这里返回的是一个引用,因此result就是b的引用,其实并非如此,这里返回引用只是减少了一次临时变量值的复制。如果真的要让result能够引用b,可以这样做:int &result = func(b);
注:返回普通变量的引用看不出效率的差异,但是返回比较大的类或者结构体的时候效率差异比较明显。
那如果是这样申明函数int func(int a);注意,这里返回的不是引用。然后int &result=func(a);会发生什么情况呢?
如果是这样,编译器将报错:不能用一个临时变量来初始化一个非常量的引用变量。
要消除这种报错,可以这样写const int &result=func(a);这样虽然返回的不是引用,但是由于最后赋给的是一个引用变量,因此在返回过程中也只有一次复制过程。但是这样的result是不能修改其引用的内容的。
还有一种看似更为诡异但却十分合理的情况:
int &func (int &a);同样假设该函数传入一个int的引用,在func中修改它,然后返回其引用。然后这样调用func(b)=3;这样的后果是,传入的b的值变为3。原因是func返回了一个b的引用,然后再将该引用赋为3,因此b的值也变成了3。
如果要禁止这种情况的发送,可以这样声明函数:const int &func(int &a);这样返回的是一个const引用,它不允许使用该引用修改其指向的值。因此如果有func(b)=3这样的调用,将通不过编译。
例如:
string foo( );void bar(string&s)// 那么下面的表达式将是非法的:bar(foo( ));bar("hello world");
foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。引用型参数应该在能被定义为const的情况下,尽量定义为const
转自:http://blog.csdn.net/piratejk/article/details/6162554
- “引用作为函数参数”与 “引用作为函数返回值”
- c++函数返回值与引用
- c++函数返回值与引用
- C++函数返回值与引用
- c++函数返回值与引用
- c++函数返回值与引用
- 常量函数、常量引用参数、常量引用返回值[C++]
- 常量函数、常量引用参数、常量引用返回值[C++]
- 函数返回值 返回引用
- 引用返回函数值
- 值返回与引用返回
- <重拾C++>函数返回值为引用
- 12.c++-返回引用的函数
- <<c++primer>>返回引用的函数调用
- C语言函数说明与返回值
- C语言之函数与返回值
- 函数的引用返回值
- 函数的引用返回值
- 第五周-设计三角形类(构造函数)
- 二维码小觑
- 黑马程序员——JAVA学习日志2
- 2013年4月_武科大程序设计大赛_解题报告(problem 1001)
- C++虚函数
- c++函数返回值与引用
- 职场上,如何做人做事做管理
- hud 3496 Watch The Movie(二维费用背包)
- 定义Fibonacci数列
- 第三章 OGRE中的光照,阴影,摄像机和视口
- 关于“2”这个数字
- 题目1051:数字阶梯求和
- cocos2d-x学习笔记-CCSprite(精灵)
- 【VOIP】Open source