web-dev-qa-db-ja.com

特定の関数の参照演算子(C ++)を理解するのに助けが必要

大学の現在の学期では、C++でOOPに取り組んでいます。
ポインタと参照演算子の違いを理解したいと思います。

私が理解している違いは次のとおりです。
1。参照変数がバインドされているオブジェクトを変更できません
2。 &演算子を入力せずに、参照変数を使用してバインドされたオブジェクトを参照できます(* pi = 5;を書き込むポインターとは対照的です)。

また、参照変数には、バインドされているオブジェクトのアドレスが含まれていますか?
例:

int i;
int &ri = i; 

ここでriにはiのアドレスが含まれていますか?

そして、列挙の この例 で++演算子をオーバーロードするときに、関数名の前に逆参照演算子またはreference(*)演算子を使用する理由。

2
Chris

参照は1つの目的を果たします:既存の変数に対してエイリアスとして機能するため:

_int i;
int &ri = i;
_

この例では、iriの-​​addressesは同じです(_&i == &ri_)。 2つの名前は、メモリ内のまったく同じ場所を指します。したがって、参照の有用なアプリケーションの1つは、再入力するのは無駄になる長い名前のエイリアスを提供することです。

_const Location& p = irresponsibly_long_object_name.retrieve_location();
_

関数パラメーターを参照で渡すと、同じ効果があります。

_void increment(int& parameter) { ++parameter; }

int main(int argc, char** argv) {
    int variable = 0;
    increment(variable);
}
_

ここでは、parameterは、_int& parameter = variable_として定義されているかのように、variableの-​​エイリアスとして機能します。 increment()内のparameterを変更することは、main()内のvariableを変更することと区別できません。さらに、これは非常に便利です。variableをコピーする必要はありません。したがって、_std::list<int>_などの大きな型の場合は、参照で渡す方がはるかに効率的です。それがconst参照の主なポイントです。

参照型の関数パラメーターの目的のために、コンパイラーの最も適切なアクションは、次のように内部的にポインターを使用することです。

_void increment(int* parameter) { ++*parameter; }

int main(int argc, char** argv) {
    int variable = 0;
    increment(&variable);
}
_

これは興味深い詳細であり、覚えておく価値があります。参照を理解することは必須ではありませんが、この同等性を認識すると、ポインタをexplicit参照と考えることができます。同様に、参照は暗黙のポインターです。

6
Jon Purdy

技術的には、int*型の変数とint&型の変数の間に大きな違いはありません(逆参照とメンバーアクセスに関する構文の詳細を除く)。 IMHOの実用上の主な違いは、初期化後に参照が参照しているオブジェクトを変更できないこと(ポインタが指しているアドレスを変更できること)と、参照をNULLにすることはできません(少なくとも、醜いC++キャストがない限り)ハッキング)。

これはトピックの包括的な説明です:

http://www.parashift.com/c++-faq-lite/references.html#faq-8.2

2
Doc Brown

技術的に言えば、参照はオブジェクトではなく、その内容について推論することはできません。ただし、実際には、それらが頻繁に実装される方法である、内部の指針として。

関数の宣言/定義についてはnot operatorです。それらは構文です。 int&typeです。 「参照を返す」という意味です。 int&を返すことは、intを返すことと何の違いもありません-そのタイプのものを返します。

もちろん、構文としての二重使用and演算子は役に立ちませんが、ここでは操作は行われません。

1
DeadMG

参照は、既存のオブジェクトの別名(別名)です。 「参照渡し」の力と、オブジェクト自体と同じように使用できるという便利さがあります。

あなたの例では、riとiのアドレスは同じで、それぞれの値は同じです。コンパイラーがこれをどのように処理するかは別のトピックですが、実際には最初の文まで要約されます。

1
kirk.burleson