Retuse return语句或通过参数引用返回

时间:2015-01-07 11:14:15

标签: c++

在函数中返回值时的惯例是什么?

这两种情况除外,还是一种风格优先于另一种?

MyObj
do_something(int n);

void
do_something(int n, MyObj& obj);

谢谢!

编辑:对不起,我在第一种情况下按值返回。

2 个答案:

答案 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成员函数。在这种情况下,函数的作用是 修改对象的状态,所以很自然地,它将对象视为 进出参数。