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