這兩個用法有什麼區別嗎?參數以const原始引用傳遞,只有原語
void Foo(const double &n)
{
cout<< "Hello: " << n << endl;
}
2.
void Foo(double n)
{
cout<< "Hello: " << n <<endl;
}
我正在尋找一個籠統的回答,不僅爲這一背景下。 (1.
使用讓我感到困惑。)
這兩個用法有什麼區別嗎?參數以const原始引用傳遞,只有原語
void Foo(const double &n)
{
cout<< "Hello: " << n << endl;
}
2.
void Foo(double n)
{
cout<< "Hello: " << n <<endl;
}
我正在尋找一個籠統的回答,不僅爲這一背景下。 (1.
使用讓我感到困惑。)
不能修改參數的值在第一個片段,在第二個就可以了。
功能之外,它們都保持不變,因爲第二個按值傳遞。
void Foo(const double &n)
{
n = 3; //ERROR
}
void Foo(double n)
{
n = 3; //OK
}
對於非基本類型,它在性能上有所不同。如果您通過引用(1.
)傳遞原始對象,而不是副本。如果按值傳遞,則創建副本。
如果您使用的是引用以及引用引用的值發生了更改,則該更改將通過引用可見。如果按值傳遞,則更改將不可見。例如:
#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;
}
這裏是一個例子,顯示「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'的副本。
+1。在第一種情況下,如果需要,您可以返回參數的地址或參數的引用,而在第二種情況下,則不能,因爲參數在函數退出時不存在。 – ereOn