这两种用法有什么区别吗?
1
void Foo(const double &n)
{
cout<< "Hello: " << n << endl;
}
2
void Foo(double n)
{
cout<< "Hello: " << n <<endl;
}
我正在寻找一般答案,不仅仅是针对这种情况。 (1.
用法让我很困惑。)
答案 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'的副本。