2012-05-29 58 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'的副本。