26

このコードでは、なぜ f() が "double & f(..." と宣言されているのでしょうか? それは何を意味し、どのように機能するのでしょうか? 私の質問に対する答えを見つけるために何をグーグル検索すればよいかさえわかりません。助けてください。

double a = 1, b = 2;
double & f (double & d) {
    d = 4;
    return b;
}

アンパサンド記号が変数または関数のアドレスを意味することは知っていますが、関数を宣言するときにそれを記述する理由がわかりません。

4

3 に答える 3

29

次の2つの関数について考えてみます。power2()およびadd()

void power2 (double& res, double x) {
    res = x * x;
}

double& add (double& x) {
    return ++x;
}

最初はの累乗を計算しx、結果を最初の引数、に格納しますres–それを返す必要はありません。

2番目は参照を返します。これは、この参照に後で新しい値を割り当てることができることを意味します。

例:

    double res = 0;

    power2(res, 5);
    printf("%f\n", res);


    printf("%f\n", ++add(res));

出力:

25.000000
27.000000

272番目の出力は26ではなく、であることに注意してください。これは、通話++内での使用によるものです。printf()

于 2013-02-27T08:03:22.513 に答える
19

演算子が宣言形式で使用され、その前に型が付いている場合&、それは「のアドレス」ではなく「参照先」を意味します。これは基本的に、ポインター演算が無効になっている自動的に逆参照されるポインターです。

Cには参照がないため、参照を渡したり、参照で返したりする場合は、constポインターを渡し、それを逆参照して、ポイントされた値にアクセスする必要がありました。C ++は、この概念を容易にし、ポインター演算を使用して誤ってアドレスから外れるのを防ぎ、ポインターを逆参照する必要をなくすための参照を追加しました。これにより、操作がはるかに簡単になり、構文がよりクリーンで読みやすくなります。

于 2013-02-27T08:03:13.527 に答える
6

この場合、アンパサンドはアドレスを取ることを意味するのではなく、参照を意味します。ここでfは、パラメーターとして double への参照を受け取り、double への参照を返す関数を示します。

C++ のリファレンスについては、言語の非常に基本的な部分であるため、選択した教科書で読みたいと思うかもしれません。

于 2013-02-27T07:51:27.313 に答える