在阅读有关将对函数的引用作为参数进行传递的同时,我发现了本文passing arguments by reference(及其讨论的代码),其中指出:

void getSinCos(double degrees, double &sinOut, double &cosOut)
{
   //SOME PROCESSING WITH THE PARAMETERS
}



当定义的参数是非常量引用时,我们当然不能传递诸如 3 或其他整数/双字面量之类的临时变量,但是如何修改输入变量并在同一变量中恢复输出(如如对本文所述,对原始变量进行更改会很麻烦吗?当我刚接触C++时,有人可以指导我吗?

最佳答案

人们可能根本没想到这一点。假设您有以下代码:

int x = 5;
foobar(x);

函数调用后x的值是什么?大多数人希望它仍然是5,因为除非有未定义的行为,否则按值传递时它不能更改。在C语言中,甚至没有引用传递,因此该值始终为5。现在在C++中,突然有引用传递,仅从该代码段中,您就无法知道函数调用后x是否会更改。为此,您必须查看foobar的实际签名。

它本身并不“危险”,但是如果使用不当,可能会导致代码不清晰和误导。尤其是当您混合使用参数时,有些参数是out参数,有些参数则没有参数,而有些参数具有误导性。在您的示例中,参数名称包含out来指示它们不在参数中,这是减轻这种危险的好样式。

将其与以下片段from here进行对比,以解释按引用传递在C#中的状态:
void Method(ref int refArgument)
{
    refArgument = refArgument + 44;
}

int number = 1;
Method(ref number);
Console.WriteLine(number);
// Output: 45

在这里,您立即看到它通过引用传递,因为它说ref number

关于c++ - 关于通过引用传递论点的澄清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54212898/

10-11 22:38
查看更多