参数传递与const原语引用和唯一原语

时间:2012-05-29 11:54:31

标签: c++ parameter-passing

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

1

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

2

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

我正在寻找一般答案,不仅仅是针对这种情况。 (1.用法让我很困惑。)

3 个答案:

答案 0 :(得分:2)

您无法修改第一个代码段中参数的值,您可以在第二个代码段中修改。

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

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

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

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

这是另一个显示'const double&amp;'之间差异的例子和'双'类型。

#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'的副本。