BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #98859同步于 2019/4/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【问题】关于函数返回值的菜鸟问题

yo1995
2019/4/21镜像同步9 回复
@caicai617 @cocoyimasa @whw0928 tldr:应该如何决定一个函数返回值是什么? --- 写过不少代码,但一直对这个问题有疑问,如果各位有推荐的参考书籍或需要补上的知识请不吝赐教!感觉是一个方法论的问题。 写C程序的时候,调用许多标准库函数或系统函数时返回值常为状态值或errno或有特定含义的数值等等,如strncpy、fopen以至于main函数;当然自己也因为这种惯性思维吃过亏; 写Python的时候因为动态语言变量随取随用的特点,有时贪图方便就把经过函数处理完、想要接着用的值包在一个tuple或list里返回; 写MATLAB有时还会根据参数的不同返回不同个数的值。 按我自己的理解,“功能性”的函数应该返回状态值,而“操作数据”的函数则应该返回对应的数据。比如 bool isEmpty(object a); data getData(); void setData(Data a); T max(T a, T b); 但很多时候,自己也分不清到底该返回不返回,返回什么。 有一段时间严格遵守“能不返回就不返回”的写法,返回值一律写成 void 或 int,甚至把结果都用指针和引用传来传去,但自觉无厘头。后来遵循“想返回什么就返回什么”的写法,虽然很自然,但重看重构代码有时觉得以前的设计不好,也很纠结。 特来请教!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
caicai617机器人#1 · 2019/4/21
帮顶
lsdsjy机器人#2 · 2019/4/21
这不是函数返回值的问题,是可变与不可变的问题。两种风格有各自的考虑和优缺点,所以有各自适用和不适用的场景。比如可以类比一下js里Array的map和splice。相关话题:函数式编程,immutability等等
tonyjansan机器人#3 · 2019/4/21
C语言中函数设计更多关注点在于内存的传递和维护上,当你对数据粒度和内存管理的需求较高时,对于 Data getData(); void setData(Data a); 这一类方法要格外注意: 1. Data的内存结构是什么; 2. getData返回值的内存由谁来分配,谁来释放; 3. setData传递的a参数由谁来分配,谁来释放。 当然,智能指针一定程度上能在代码编写上简化这类问题,但内存管理的基本理念还是要清楚。
chenxiansf机器人#4 · 2019/4/21
应该是都返回比较好吧,fopen就返回文件描述符和错误这样。可以看看go的返回值,结果加error的方式
lance6716机器人#5 · 2019/4/21
风格问题吧,文档说清楚就好 返回正确错误、返回一个或多个结果、通过修改实参返回、修改类成员(最讨厌这个)或者全局变量、抛异常
yo1995机器人#6 · 2019/4/21
有道理!之前没有从这方面考虑过这个问题。 【 在 lsdsjy 的大作中提到: 】 : 这不是函数返回值的问题,是可变与不可变的问题。两种风格有各自的考虑和优缺点,所以有各自适用和不适用的场景。比如可以类比一下js里Array的map和splice。相关话题:函数式编程,immutability等等
yo1995机器人#7 · 2019/4/21
对对!自己对这个问题一直都有疑惑。[em2]比较现代的语言很多时候简化了内存管理的过程。 但之前写cpp的时候有时就搞不清。比如Data getData(); 这种函数,很多时候为了不给自己找麻烦,我宁可写成int getData(Data &d); 这样的形式,然后统一在更高层或是main函数中声明变量、初始化对象等等。 但总觉得这样写有时候不够清晰,包括上面楼层提到的可变不可变的问题,不知道这样是不是一个好的方法。 另外就是异常处理,如果在较低层函数中操作内存,总怕自己没法做好异常后内存的清理、抛出异常等等,因此很抵触这么做;但传值返回又怕效率低下,所以最后就变成了上述的类似于在main中把所有用到的变量全声明好的写法,感觉很不合理。 不知道有没有更合理的方法推荐!谢谢! 【 在 tonyjansan 的大作中提到: 】 : C语言中函数设计更多关注点在于内存的传递和维护上,当你对数据粒度和内存管理的需求较高时,对于 : [code=c] : Data getData(); : ...................
Nroskill机器人#8 · 2019/4/21
个人认为,cpp由于语言本身的问题,尤其是为了兼容c,返回值是状态值是常见的实现方式,如果有需要返回复杂类,就用指针/引用
nuanyangyang机器人#9 · 2019/4/22
历史原因。以前不支持多返回值以及异常处理。现在往前看,看看c++17的optional,还有rust问题吧。