2012-05-29 40 views
0

这两个用法有什么区别吗?参数以const原始引用传递,只有原语

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

2.

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

我正在寻找一个笼统的回答,不仅为这一背景下。 (1.使用让我感到困惑。)

回答

2

不能修改参数的值在第一个片段,在第二个就可以了。

功能之外,它们都保持不变,因为第二个按值传递。

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

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

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

+1

+1。在第一种情况下,如果需要,您可以返回参数的地址或参数的引用,而在第二种情况下,则不能,因为参数在函数退出时不存在。 – ereOn

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; 
} 
0

这里是一个例子,显示“const的双&”之间和“双”类型的差异。

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