将在函数中传递引用作为参数以更改参数变量的值。

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() 函数中编写每个变量更改,并且它们还避免我重复编写相同的代码。

如果我不应该这样做,还有什么选择?

Arn*_*rah 5

对于交换的情况,应使用引用传递,因为函数中正在更改多个变量,并且函数的预期行为是显而易见的。如果您只更改一个变量或有一个应该返回结果的函数,那么最好在大部分情况下返回一个值(有一些例外)。例如,假设您有一个函数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始终建议使用引用将大对象传递给函数,因为它可以避免复制。