c++函数返回值与引用
来源:互联网 发布:android相册开发源码 编辑:程序博客网 时间:2024/05/22 12:38
对于函数的返回值,看似简单,但并非如此,比如:
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这样的调用,将通不过编译。
- “引用作为函数参数”与 “引用作为函数返回值”
- c++函数返回值与引用
- c++函数返回值与引用
- C++函数返回值与引用
- c++函数返回值与引用
- c++函数返回值与引用
- 常量函数、常量引用参数、常量引用返回值[C++]
- 常量函数、常量引用参数、常量引用返回值[C++]
- 函数返回值 返回引用
- 引用返回函数值
- 值返回与引用返回
- <重拾C++>函数返回值为引用
- 12.c++-返回引用的函数
- <<c++primer>>返回引用的函数调用
- C语言函数说明与返回值
- C语言之函数与返回值
- 函数的引用返回值
- 函数的引用返回值
- Fedora下adsl共享上网
- CiteSeerX
- Objective-C中的@property和@synthesize用法
- cocos2d-js 小笔记
- Android4.4.2模拟器上跑Art模式
- c++函数返回值与引用
- NYOJ Dinner
- C++程序中统计程序运行时间
- Java的图片处理工具类
- 使用GetBestInterfaceEx获取电脑正在使用的MACAddress
- 我的游戏框架基础构建篇(cocos2dx 循环滚动地图的实现)
- zookeeper安装与启动
- Android UI 滚动、手势、速度的三个帮助类学习
- Web1800 3.5.5版将于1月20号正式对老客户开放试用