2017-07-10 7 views
1

私はC++を学んでいます。私は参考文献を読んで、いくつかの練習をしました(シンプル)。しかし、このコードには理解の問題があります。C++言語のリファレンス

const int& GetMax (const int& valuel, const int& value2)です。

誰も私が関数型の参照を渡している理由とそれが(引数の型の中で)何をするのか理解できますか?この場合、何を参照するのですか?

+1

https://en.wikipedia.org/wiki/Reference_(C%2B%2B) –

+0

thnx、非常に役立ちます。 –

+0

Stack Overflowに関する[C++での参照変数とは何ですか?](https://stackoverflow.com/q/2765999/608639)を参照してください。 – jww

答えて

6

C++での参照は、正確にはです。これは、他の変数を参照する変数名です。

文の観点で考える:

int xyzzy = 1; 
int &plugh = xyzzy; 
int twisty = xyzzy; 

実際の「オブジェクト」ここxyzzyのためには、値1を含むものです。あなたはその名前をxyzzyと呼んでいますが、それは本当にその名前です。それらは、(への参照)の両方の名前であるので、また同じことをxyzzyの値を変化させるplughの値を変更する -

plughに別の参照全く同じ基礎となるオブジェクトです。

twisty変数は、他方では、それに横切ってxyzzy新しいオブジェクトと単にコピーした値として生成されます。それは(文字列のような)/コピーを構築することは比較的高価だオブジェクトへの参照を渡すために、より効率的なので、コードに

void fn(const string &str1) { ... } 


あなたは、多くの場合のようなものが表示されます。オブジェクトへの参照を渡すと、現在存在するオブジェクトに直接アクセスできるようになり、constは関数の変更を防ぎます。

intのような基本的なタイプでこれを行うのは非常に珍しいことです。複製するコストは非常に小さく、通常は参照を渡すコストとほぼ同じです。

あなたはは時折のようなものが表示されます

void fn(int &thing) { ... } 

それはthingは、関数内で変更されることが予想され、その変更が呼び出し元にミラーリングされますので、通常です。

あなた特定コードは、おそらく参照のリターンのおかげで、任意の新しいオブジェクトを作成していない(私はより多くのコンテキストなしで確認することはできませんが)何をしているか

。次のコードが示すように、私の最高の推測では、実装の並べ替えは、それがなければなりません。それに

const int& GetMax(const int& value1, const int& value2) { 
    if (value1 >= value2) 
     return value1; 
    return value2; 
} 

、コードを:

int val1 = 7; 
int val2 = 42; 
const int &biggest = GetMax (val1, val2); 

が実際にbiggestが参照するの参照を設定しますval1val2のうち最大のものです。言い換えれば、擬似コードと機能的に同等です。

val1 = 7 
val2 = 42 
if (val1 > val2) 
    biggest = reference to val1 
else 
    biggest = reference to val2 
+0

thnx私はそれを得ましたが、私たちが* ** int&***? –

+1

しかし、 'const int&'をパラメータに渡すことに利点はありますか?それは 'int'であるので、データの対処に関して何ら利点をもたらさず、' const'なので変更できません。だから、 'int'の代わりに' const int& 'を渡す点は何ですか? – taskinoor

+2

@taskinoor:質問の新しい情報に基づいて回答を更新しました。 *参照*を変数に戻したいので、その存続期間が関数を超えているものを使用する必要があります。言い換えれば、値渡しのパラメータと地方は、方程式の外にあります。 – paxdiablo

0

intを参照渡ししないと、関数内部からは変更できません。 intのコピーは代わりに変更されます。