web-dev-qa-db-ja.com

関数宣言の戻り値の型のアンパサンドはどのように機能しますか?

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

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

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

21
Azad Salahli

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

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

16
dtech

次の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
_

2番目の出力は26ではなく_27_であることに注意してください。これは、printf()呼び出し内で_++_が使用されているためです。

25
kamituel

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

C++のリファレンスは言語の非常に基本的な部分であるため、選択した教科書で読むことをお勧めします。

6
Arne Mertz