函数的返回值不能是数组或函数,但是可以是是数组和函数的指针或引用

函数返回一个值的过程和初始化完全一致,先创建一个临时变量,用返回值初始化该临时变量,然后用该临时变量去初始化另一个变量或者给另一个变量赋值

所以函数的返回值只是返回对象的拷贝

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——函数的返回值相关推荐

  1. Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数

    Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数 内容大纲 1.函数的初识 2.函数的定义 3.函数的调用 4.函数的返回值 5.函数的参数 1.函数初识 # def ...

  2. async js 返回值_获取JavaScript异步函数的返回值

    今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值? 1.错误尝试 当年未入行时,我的最初尝试: function getSomething() { var r = 0; setTim ...

  3. 站长在线Python精讲:Python中函数的返回值

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中函数的返回值>.本文的主要内容有:函数的返回值的含义.函数设置返回值的作用.return语句位置与多条 ret ...

  4. 11. 函数进阶-函数名,返回值,作用域

    11. 函数进阶 目标:掌握函数相关易错点 & 项目开发必备技能. 概要: 参数的补充 函数名,函数名到底是什么? 返回值和print,傻傻分不清楚. 函数的作用域 1.参数的补充 在函数基础 ...

  5. Qt 使用C++特性“引用” - 获得槽函数的返回值

    QT信号与槽中,槽函数是可以定义有返回值的,但是我们都是在connect函数中进行调用,那么该如何获得调用后的槽函数的返回值呢? 答案是不可能获得了的! 槽函数虽然可以定义返回值类型,但其实他和信号一 ...

  6. wpf 窗口的返回值_如何:获取页函数的返回值

    如何:获取页函数的返回值How to: Get the Return Value of a Page Function 03/30/2017 本文内容 本示例显示如何获取页函数的返回值.This ex ...

  7. getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...

    2013-07-18 21:35:58 getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析. char是字符型数 ...

  8. ajax回调函数的返回值,使用ajax和回调函数向函数传递/返回值

    我试图读p_info函数返回从函数getproductInfo包含ajax调用,但我得到未定义的值.我使用回调函数来实现这一点,但仍然无法正常工作.我错在哪里?使用ajax和回调函数向函数传递/返回值 ...

  9. Long类型传到前端失去精度(2):Long类型不是实体类的某一个字段,Long类型是一个函数的返回值

    Long类型传到前端失去精度(2):Long类型不是实体类的某一个字段,Long类型是一个函数的返回值 又是转换Mybatis-Plus的一天,又遇到了之前熟悉的问题:Long类型传到前端失去精度.可 ...

最新文章

  1. 今晚直播 | 来自《简明的 TensorFlow 2》作者,Google开发者专家的分享
  2. 盖茨在毕业礼上给毕业生的11个人生建议
  3. Windows Server 2003 R2 修复Windows Server 2003
  4. 云计算技术 — 云计算的商业模式与部署模式
  5. 让PIP源使用国内镜像
  6. mongoDB3.4主从复制实现(第一种情况亲测)
  7. 【设计模式】【行为型模式】模板模式
  8. 1536299 2013 - PPR item change - Genil mode
  9. vmware服务器虚拟化部署sdn,使用VMware的NSX多面落地软件定义网络SDN视频课程
  10. oracle 动态游标行数,oracle动态游标的简单实现方法
  11. ORACLE JOB 失败 查看,Oracle JOB异常中断原因分析
  12. [转]CPoint+CSize+CRect学习大纲
  13. indexOf、lastIndexOf、substring等详解
  14. java dbcursor_优化JAVA查询Mongodb数量过大,查询熟读慢的方法
  15. Linux中移动,复制,删除,打包排除某个目录或文件
  16. 软件测试总结--02缺陷报告
  17. AutoCAD VBA创建椭圆和样条曲线
  18. 推荐五个免费UML建模工具
  19. Java 9 的 9 个特性
  20. 蓝桥杯—大胖子走迷宫—广搜

热门文章

  1. 【机器学习实战】第3章 决策树(Decision Tree)
  2. 这些git技能够你用一年了
  3. 使用 HTML5、CSS3 和 MathML 在 EPUB 3 中制作版式丰富的出版物
  4. [逆向基础] C++中基本数据类型的表现形式
  5. SSM+微信小程序实现物业管理系统
  6. 零基础Java学习之继承
  7. java中toString的使用
  8. GBDT指标重要性计算
  9. 使用Flink的Savepoint功能
  10. ELK 使用4-Kafka + zookpeer