C++知识点8——函数的返回值
函数的返回值不能是数组或函数,但是可以是是数组和函数的指针或引用
函数返回一个值的过程和初始化完全一致,先创建一个临时变量,用返回值初始化该临时变量,然后用该临时变量去初始化另一个变量或者给另一个变量赋值
所以函数的返回值只是返回对象的拷贝
int func()
{int a=1;return a;
}int b=func();
在上面的代码中,函数并不是返回a本身,而是返回a的拷贝,这个拷贝在一个临时变量里存放,a在函数作用域结束后被释放,无效,之后用该临时变量来初始化b
不能返回局部变量的引用和指针
const string &localparatest()
{string res;if (res.empty()) {return "empty";}else {return res;}
}
上述代码编译时会提示返回局部变量的引用,因为局部变量在函数作用域结束时就会被释放,所以引用将绑定一个无效的变量,导致出现该警告
同理,也不要返回局部变量的指针,因为函数结束后,局部变量的指针将指向一块无效的内存区域
所以,不要返回局部变量的指针和引用
引用是左值,可以放在等号左边,而函数可以返回引用,所以返回合法引用的函数可以作为左值,来绑定变量
int main(int argc, char const *argv[])
{string str="asdf";char a='q';returnreference(str, 2)=a;cout<<str<<endl;return 0;
}char &returnreference(string &str, string::size_type index)
{assert(index<str.size());return str[index];
}
函数returnreference返回字符的引用,所以可以将returnreference作为左值(实际是str的第三个字符)来绑定字符变量a
所以str的第三个字符被改为q
返回数组指针和引用
函数不能返回数组,但是可以返回数组的指针和引用,声明或定义一个返回数组的指针或引用的函数比较麻烦,代码如下:
int (*returnarrayp(int a))[10];
int (&returnarrayr(int a))[10];
上述代码读法和写法的规则都遵循先中间,再两边的规则,参见C++知识点6——数组与指针初步
int (*returnarrayp(int a))[10]
先看中间returnarrayp(int a),是一个形参为int的函数,再看左边星号,返回的是一个指针,该指针指向一个int数据,看到右边的[10]得知该指针指向一个int数组,数组的大小为10
int (&returnarrayr(int a))[10];同理
示例
int arr[3][3]={};
int main(int argc, char const *argv[])
{int (*p)[3]=returnarrayp(3);//函数调用for (int i=0;i<3*3;++i) {cout<<p[i/3][i%3]<<endl;}return 0;
}int (*returnarrayp(int a))[3]
{for (int i=0;i<3*3;++i) {//一次循环给二维数组赋值arr[i/3][i%3]=a;}return &arr[0];//返回数组的指针
}
注意:函数返回数组的指针或引用时,返回值数组的维度和函数声明时数组的维度必须一致,否则报错,原因是因为如果数组的指针指向一个二维数组,那么必须和二维数组里的每一个一维数组匹配
返回数组的引用的函数示例
int arr[3][3]={};
int main(int argc, char const *argv[])
{int (&r)[3]=returnarrayr(4);for (int i=0;i<3;++i) {cout<<r[i]<<endl;}return 0;
}int (&returnarrayr(int a))[3]
{for (int i=0;i<3*3;++i) {arr[i/3][i%3]=a;}return arr[0];
}
注意:main函数中,数组的引用r只绑定了二维数组中的第一个一维数组,所以不能用一维数组的引用遍历二维数组,否则报错
而二维数组可以通过数组指针遍历,因为指针可以指向不同的内存,而引用只是固定的绑定对象
参考:
《C++ Primer》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
C++知识点8——函数的返回值相关推荐
- Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数
Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数 内容大纲 1.函数的初识 2.函数的定义 3.函数的调用 4.函数的返回值 5.函数的参数 1.函数初识 # def ...
- async js 返回值_获取JavaScript异步函数的返回值
今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值? 1.错误尝试 当年未入行时,我的最初尝试: function getSomething() { var r = 0; setTim ...
- 站长在线Python精讲:Python中函数的返回值
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中函数的返回值>.本文的主要内容有:函数的返回值的含义.函数设置返回值的作用.return语句位置与多条 ret ...
- 11. 函数进阶-函数名,返回值,作用域
11. 函数进阶 目标:掌握函数相关易错点 & 项目开发必备技能. 概要: 参数的补充 函数名,函数名到底是什么? 返回值和print,傻傻分不清楚. 函数的作用域 1.参数的补充 在函数基础 ...
- Qt 使用C++特性“引用” - 获得槽函数的返回值
QT信号与槽中,槽函数是可以定义有返回值的,但是我们都是在connect函数中进行调用,那么该如何获得调用后的槽函数的返回值呢? 答案是不可能获得了的! 槽函数虽然可以定义返回值类型,但其实他和信号一 ...
- wpf 窗口的返回值_如何:获取页函数的返回值
如何:获取页函数的返回值How to: Get the Return Value of a Page Function 03/30/2017 本文内容 本示例显示如何获取页函数的返回值.This ex ...
- getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...
2013-07-18 21:35:58 getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析. char是字符型数 ...
- ajax回调函数的返回值,使用ajax和回调函数向函数传递/返回值
我试图读p_info函数返回从函数getproductInfo包含ajax调用,但我得到未定义的值.我使用回调函数来实现这一点,但仍然无法正常工作.我错在哪里?使用ajax和回调函数向函数传递/返回值 ...
- Long类型传到前端失去精度(2):Long类型不是实体类的某一个字段,Long类型是一个函数的返回值
Long类型传到前端失去精度(2):Long类型不是实体类的某一个字段,Long类型是一个函数的返回值 又是转换Mybatis-Plus的一天,又遇到了之前熟悉的问题:Long类型传到前端失去精度.可 ...
最新文章
- 今晚直播 | 来自《简明的 TensorFlow 2》作者,Google开发者专家的分享
- 盖茨在毕业礼上给毕业生的11个人生建议
- Windows Server 2003 R2 修复Windows Server 2003
- 云计算技术 — 云计算的商业模式与部署模式
- 让PIP源使用国内镜像
- mongoDB3.4主从复制实现(第一种情况亲测)
- 【设计模式】【行为型模式】模板模式
- 1536299 2013 - PPR item change - Genil mode
- vmware服务器虚拟化部署sdn,使用VMware的NSX多面落地软件定义网络SDN视频课程
- oracle 动态游标行数,oracle动态游标的简单实现方法
- ORACLE JOB 失败 查看,Oracle JOB异常中断原因分析
- [转]CPoint+CSize+CRect学习大纲
- indexOf、lastIndexOf、substring等详解
- java dbcursor_优化JAVA查询Mongodb数量过大,查询熟读慢的方法
- Linux中移动,复制,删除,打包排除某个目录或文件
- 软件测试总结--02缺陷报告
- AutoCAD VBA创建椭圆和样条曲线
- 推荐五个免费UML建模工具
- Java 9 的 9 个特性
- 蓝桥杯—大胖子走迷宫—广搜