我在阅读“通过游戏编程开始C++,第四版”时发现有一段要在函数中传递引用作为参数的部分,内容为:
“仅当您想更改值时才传递引用
参数变量的值。但是,您应尽量避免更改
参数变量。”
基本上说我应该避免做这样的事情:
void swap(int& x, int& y)
{
int temp = x;
x = y;
y = temp;
}
但是,为什么我应该避免这样做呢?
我发现创建用于更改变量的函数非常有用,因为这些函数使我的代码井井有条,避免了我在main()函数中编写每个变量更改,并且还避免了我重复编写相同的代码。
如果我不应该这样做,还有什么选择?
最佳答案
对于交换的情况,应该使用按引用传递,因为函数中的多个变量正在更改,并且该函数的预期行为显而易见。如果仅更改一个变量或具有应返回结果的函数,则最好返回大部分值(某些情况除外)。例如,假设您有一个函数sum()
:
int sum(int a, int b)
{
return a + b;
}
此功能的用法可能是:
int x = sum(1, 2); // Obvious and to the point
由于不需要更改任何变量,因此可以在此处使用按值传递(在此处传递
const
引用无关紧要,因为POD类型非常小)。如果您在此处使用了按引用传递,则该功能将变为:void sum(int a, int b, int& sum)
{
sum = a + b;
}
上面函数的用法可能是:
int s;
sum(1, 2, s); // Obscure, unclear
这样做的缺点是目前尚不清楚该函数的意图,并且现在该函数的结果无法在一行中传递给另一个函数。因此,仅在绝对必要时才应使用引用传递。
附带说明一下,始终建议使用
const
引用将大型对象传递给函数,因为它避免了复制。