这两个用法有什么区别吗?参数以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