使用常量基元引用且仅基元进行参数传递
Parameter passing with const primitive reference and only primitive
这两种用法有什么区别吗?
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"的副本。
相关文章:
- 使用引用与指针将数组作为参数传递
- 为什么我不能将引用作为 std::async 的函数参数传递
- 如何将指针变量作为引用参数传递?
- 移动类的成员作为常量引用参数传递
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 将双指针作为参数传递给需要引用 std::vector <double>的函数
- 如何通过引用将参数传递给模板类的成员函数?
- 如何将对向量的引用作为可变参数传递?
- 我可以更改将引用参数传递到指针中并使其正常工作的函数的输入(C、C++)吗?
- C++:将引用作为参数传递,但该函数不接受引用作为参数
- 将类型参数传递给自引用指针
- C++ 在C++中通过引用将枚举作为默认参数传递时出错
- 将函数的引用和 lambda 表达式作为参数传递时有什么区别?
- 即将将引用作为函数中的参数传递以更改参数变量的值
- 当将对象传递给具有参数作为引用类型的函数以及当其类对象类型时,会得到不同的输出
- 传递引用参数并返回引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- 使用引用参数传递引用意外行为