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