0

これら2つの使用法に違いはありますか?

1.

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

2.

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

この文脈だけでなく、一般的な答えを探しています。(1.使用法は私を混乱させます。)

4

3 に答える 3

2

最初のスニペットではパラメーターの値を変更できませんが、2 番目のスニペットでは変更できます。

関数の外では、2 番目のものは値渡しなので、どちらも同じままです。

void Foo(const double &n)
{
   n = 3; //ERROR
}

void Foo(double n)
{
   n = 3; //OK
}

非基本型の場合、パフォーマンスに違いがあります。参照渡し ( 1.) の場合は、コピーではなく元のオブジェクトを渡します。値渡しの場合、コピーが作成されます。

于 2012-05-29T11:55:32.683 に答える
0

参照を使用し、参照が参照する値が変更された場合、その変更は参照を通じて表示されます。値を渡すと、変更は表示されません。例:

#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;
}
于 2012-05-29T12:12:12.150 に答える
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' のコピーを送信します。

于 2012-05-29T12:41:51.277 に答える