int foo(type& bar);是一种不好的做法?

时间:2010-04-14 16:32:30

标签: c++ function reference

好吧,我们来了。我的C ++书籍提出了另一个提议的做法。它说“返回值(非空)函数不应该将引用类型作为参数。”所以基本上如果你要实现这样的函数:

int read_file(int& into){
   ...
}

并使用整数返回值作为某种错误指示符(忽略我们有异常的事实)然后该函数编写得很差,它实际上应该像

void read_file(int& into, int& error){

}

现在对我来说,第一个更清晰,更好用。如果要忽略错误值,可以轻松完成。但是这本书暗示了后来的。请注意,本书并未说返回值函数是坏的。它宁愿说你应该只返回一个值,或者你应该只使用引用。

您对此有何看法?我的书上装满了废话吗? (再次)

5 个答案:

答案 0 :(得分:10)

建议很愚蠢。直接返回值更小,更容易输入。

直接退货:

if (read_file(...)) {
    ... handle problem ...
}

间接退货:

int status;

read_file(..., status);
if (status) {
    ... handle problem ...
}

编辑:更大的问题是是否使用非const参考参数。让副作用飞出参数会令人惊讶。一个编码标准说参考参数应该是const,输出参数应该使用指针。这样,读者在通话时获得&,喊出“此参数发生了什么”。

答案 1 :(得分:5)

我认为在整个项目中保持一致比在一种方式传播福音比在另一种方式上更重要更为重要。

答案 2 :(得分:3)

这是一个相当无趣和主观的风格辩论。就个人而言,我宁愿返回一个std::pair,一个结构,或(在TR1中)一个元组。

答案 3 :(得分:1)

他们试图教你“如果你返回一个值,不要修改调用参数中的变量”的做法

相反,您可以执行以下操作:

int read_file(const int& into){ ... }

我的语法可能略有偏差,但是const告诉你你不能在方法中改变它,但你仍然可以通过引用获得传递,这对于对象很好。使用int,它并没有真正为你买任何东西。


编辑:此外,正如其他人所指出的那样,如果您的目标是拥有多个返回值,那么通常更好的方法是按照本书的建议,或者改为创建“复合”返回类型 - 使用对,你自己的自定义类型等。

答案 4 :(得分:0)

//somewhere deep in the code space
a = func(i); //i is modified inside func() or not?    
j = i; //what is this for? depends on the answer to the first question

如果代码是根据本书建议的规则编写的,那么您可以确定仅仅通过查看调用站点就不会修改“i”,因此代码对您说的比其他更多

无论如何,我更愿意返回一个元组,而不是通过引用修改