これら2つの使用法に違いはありますか?
1.
void Foo(const double &n)
{
cout<< "Hello: " << n << endl;
}
2.
void Foo(double n)
{
cout<< "Hello: " << n <<endl;
}
この文脈だけでなく、一般的な答えを探しています。(1.
使用法は私を混乱させます。)
これら2つの使用法に違いはありますか?
1.
void Foo(const double &n)
{
cout<< "Hello: " << n << endl;
}
2.
void Foo(double n)
{
cout<< "Hello: " << n <<endl;
}
この文脈だけでなく、一般的な答えを探しています。(1.
使用法は私を混乱させます。)
最初のスニペットではパラメーターの値を変更できませんが、2 番目のスニペットでは変更できます。
関数の外では、2 番目のものは値渡しなので、どちらも同じままです。
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」タイプの違いを示すもう 1 つの例を次に示します。
#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' に送信します。2 番目のケースでは、変数 'x' のコピーを送信します。