分配给对象

时间:2011-01-23 16:34:38

标签: c++ coding-style side-effects

以下技术是否有任何合理的解释:

//value HAS TO BE CHANGED those are requirements
int f(int value)
{
int tmp = value;//In order to not change "value" inside fnc - again requirements
//do something with tmp
return tmp;
}

int a = 0;
a = f(a);//here I assign to a anyway

而不是:

void f(int& value)
{
//do something with value
}

或者这个:

int f(int& value)
{
//do something with value
return value;
}

并且您是否同意第一个代码段(通常)是一个糟糕的编程实践的例子?

7 个答案:

答案 0 :(得分:3)

我没有看到tmp = value位的原因,因为在第一个版本中,参数不是引用,但我认为通过值获取参数通常是一个好习惯,然后返回更新的副本,而不是获取和修改引用。较少的副作用使代码更易于推理。

所以我说最好的版本是这样的:

int f(int value)
{
  //do something with value
  return value;
}

int a = f(a);

我不确定你为什么坚持在第三个例子中将参数作为参考。

答案 1 :(得分:1)

如果您确实不想更改value,请将其设为const。但老实说,我认为没有理由这样做。

答案 2 :(得分:1)

如果您需要原始值value以供参考。例如,如果你想对它做一些操作然后进行比较,看看之后是否相同。并返回值。

似乎有点模糊,但这是有道理的。

答案 3 :(得分:1)

我能想到的第一个版本的一个合理解释是,即使您不想修改参数,也可以使用该函数,但只返回结果。我不同意写这样的函数是糟糕的编程习惯。

答案 4 :(得分:1)

这取决于程序员所期望的精确程度。对于这个用途a = f(a),我没有看到差异,因为结果显然是相同的。但总的来说,a = f(a) + f(a)之类的用法会产生不同的结果。所以我不能说这完全是一个糟糕的编程习惯。

答案 5 :(得分:0)

这一切都取决于你想如何使用这个功能。例如,您可以像这样评估函数的第一个版本:

avariable = f(avalue)

只有avariable会改变。

你可以像这样使用函数的第二个版本:

 f(&avalue)

只有avalue会改变。

你可以像这样使用函数的最后一个版本:

 avariable = f(&avalue)

avariableavalue都会发生变化。

他们都有自己的用途。这取决于程序员对他们的需求。只要问问自己:您需要哪个变量返回由函数修改?

答案 6 :(得分:0)

您可能需要使用原始值,这取决于您需要做什么。例如,临时变量可用于在“交换”期间存储两个参数中的一个(尽管STD中有内置的交换功能):

void swap(int& first, int& second) {
    int tmp = second;
    second = first;
    first = tmp;
}