使用常量基元引用且仅基元进行参数传递

Parameter passing with const primitive reference and only primitive

本文关键字:参数传递 引用 常量      更新时间:2023-10-16

这两种用法有什么区别吗?

1.

void Foo(const double &n)
{
   cout<< "Hello: " << n << endl;
}

阿拉伯数字。

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"的副本。