0

这两种用法有什么区别吗?

1.

void Foo(const double &n)
{
   cout<< "Hello: " << n << endl;
}

2.

void Foo(double n)
{
   cout<< "Hello: " << n <<endl;
}

我正在寻找一个普遍的答案,而不仅仅是针对这种情况。(1.用法让我感到困惑。)

4

3 回答 3

2

您不能修改第一个片段中的参数值,但可以在第二个片段中修改。

在函数之外,它们都保持不变,因为第二个是按值传递的。

void Foo(const double &n)
{
   n = 3; //ERROR
}

void Foo(double n)
{
   n = 3; //OK
}

对于非基本类型,它在性能方面有所不同。如果通过引用 ( 1.) 传递,则传递原始对象,而不是副本。如果按值传递,则会创建一个副本。

于 2012-05-29T11:55:32.683 回答
0

如果您使用引用并且引用引用的值发生更改,则该更改将通过引用可见。如果按值传递,则更改将不可见。例子:

#include <iostream>

using namespace std;

double x;

void Foo1(const double& n) {
    cout << n << endl;
    x = 23.0;
    cout << n << endl;
}

void Foo2(double n) {
    cout << n << endl;
    x = 23.0;
    cout << n << endl;
}

int main()
{
    x = 42.0;
    Foo1(x); // Will print 42.0, then 23.0

    x = 42.0;
    Foo2(x); // Will print 42.0 twice

    return 0;
}
于 2012-05-29T12:12:12.150 回答
0

这是另一个示例,它显示了 'const double&' 和 'double' 类型之间的区别。

#include <iostream>

void foo1(const double &n)
{
    const_cast<double&>(n) = 10.0;  // <-- this code changes variable referenced by n
}

void foo2(double n)
{
    const_cast<double&>(n) = 10.0;  // <-- this code changes variable n
}

int main()
{
    double x = 12.0;
    foo1(x);
    std::cout << x << std::endl;  // <-- this will print '10'

    x = 12.0;
    foo2(x);
    std::cout << x << std::endl;  // <-- this will print '12'

    return (0);
}

在第一种情况下,您将引用(几乎与指针相同)发送到变量“x”。在第二种情况下,您发送变量“x”的副本。

于 2012-05-29T12:41:51.277 回答