在函数中返回值时的惯例是什么?
这两种情况除外,还是一种风格优先于另一种?
MyObj
do_something(int n);
void
do_something(int n, MyObj& obj);
谢谢!
编辑:对不起,我在第一种情况下按值返回。
答案 0 :(得分:0)
您通过引用传递MyObj
不是因为这是标准的,而是为了避免复制MyObj
数据,如果您按值传递它将会发生。您也可以通过指针
void
do_something(int n, MyObj* obj);
你将得到类似的行为:你可以修改功能内的对象,这些修改将在你离开函数体时保持。
您也可以通过这种方式将多个变量传递给您的函数,并在不使用return
语句的情况下对它们进行修改。
考虑到这一点,在您的功能中更好地使用return
语句是跟踪您的功能行为 - 如果您的功能在某些时候失败,您可以返回相应的错误代码:
bool do_something(int foo)
{
if(foo<0)
{
return false;// something went wrong - exit with error statement
}
// do something
return true; // everything is fine - exit with success statement
}
如果您愿意,可以使用enum
结构来更好地进行错误管理。
通过return
从函数中获取modyfied数据是一个好主意,如果没有任何问题可以解决,例如在某些基本计算中。
答案 1 :(得分:0)
作为一般规则,通常更喜欢功能风格 编程,每个函数返回一个值,并修改 无论是全球状态还是其他数据,包括任何间接数据 通过指针或引用参数。这是一个非常一般的规则, 然而,肯定有例外。
支持返回值的最大理由是它意味着
客户端代码在调用之前不必定义实例
功能。如果有问题的类型不支持默认构造
(而且很多用户定义的类型都不会),那么就不能用了
参数。任何可能在表达式中使用的东西都应该是
由值返回,因为你不能在一个中使用out参数
表达。 (从技术上讲,C ++不支持输出参数,
只有in-out,因为如果你传递一个引用或一个指针,它必须引用
指向或指向有效对象。当我们在C ++中谈论参数时,
我们通常只是表示函数忽略任何先前的值,而不是
你可以传递没有先前值的东西。例外是
基本类型,如int
,可以存在于未初始化状态。)
使用参数的最常见情况是操作
可能会失败(失败不是特殊情况)。
经典的例子是读取缓冲区等; read
函数会
返回表示成功或失败的状态代码(有时在
整数形式,指定成功读取的字节数,
也许用-1作为真正错误的sentinal值,而不是结束
文件)。您可以创建一个或多或少复杂的结构来返回
所有相关信息,但其中没有任何意义,
因为无论如何你必须单独处理它。
你有一个(隐藏)输出参数的另一个常见情况是 非const成员函数。在这种情况下,函数的作用是 修改对象的状态,所以很自然地,它将对象视为 进出参数。