以下技术是否有任何合理的解释:
//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;
}
并且您是否同意第一个代码段(通常)是一个糟糕的编程实践的例子?
答案 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)
avariable
和avalue
都会发生变化。
他们都有自己的用途。这取决于程序员对他们的需求。只要问问自己:您需要哪个变量返回由函数修改?
答案 6 :(得分:0)
您可能需要使用原始值,这取决于您需要做什么。例如,临时变量可用于在“交换”期间存储两个参数中的一个(尽管STD中有内置的交换功能):
void swap(int& first, int& second) {
int tmp = second;
second = first;
first = tmp;
}