-1

私は工学部の学生で、シミュレーションに関するシニア/大学院レベルの CS コースを受講しています。これらはすべてオンラインでリソースを検索することで見つけることができることは知っていますが、それらはすべて非常にバラバラで浅い質問であるため、困難であることが証明されています.

いくつかの質問に対するいくつかの迅速な回答を期待しています。


「&」がいくつかの異なる方法で使用されているのを見てきました (アドレスの場所、およびローカル変数として関数に渡された変数を永続的に変更する) が、このコンテキストでそれが何をするのかわかりません。イベントはクラスです。

bool operator>( const Event& e ) const {
            return simulation_time > e.simulation_time;
        }

これを入力した後、その演算子がポインター(アドレス)に適用されていることに気付きました..「const Event& e」は「const Event &e」と同等のようです(「const Event & e」と同等であることがわかっています) )?

それは悪です。


次へ: このような単純な状況で const を使用する利点は何ですか?


プログラムからの抜粋:

my_heap->insert_event(event1); 

[my_heap は、ベクトル ベースのヒープ (およびイベントをヒープに追加する関数 insert_event) を含むクラスのインスタンスです。]

「→」ってどういう意味ですか?


私が見たポインタの例はすべて次のようになります

int i = 2
int *p;
p = &i;

これは問題なくダンディですが、私はこれを行っています:

MinHeap *my_heap = new MinHeap();

そして何を言っているのかわかりません。私は本当に知的な質問を定式化することさえできません。アドレスを指しているようには見えません...

-------------------------------

返信に時間を割いてくださった皆様に、事前に感謝いたします

4

3 に答える 3

3

オペレーター

主な用途は2つあります。1つは、ご存知のように、メモリ内の変数のアドレスを取得することです。したがってint count = 0;、の値countが0の場合、この変数はメモリ内のどこにありますか?&countはこのアドレスを返します。これは、さまざまな方法で役立ちます。

もう1つの用途は、型への参照を宣言/定義することです。このコンテキストで&は、もはや演算子ではなく、ユーザー定義クラスでカスタム動作を与えることはできないことに注意してください。int & myRef整数への参照を表します。これはポインタに非常によく似ていますが、あるアドレスをメモリに保持する変数を使用する代わりに、ある変数を別の変数の一種の仮名として使用しています。int &myRef = count;、この後、 100%互換的countmyRef使用できます。この使用は、変数を定義または宣言する場合にのみ発生し、式の右辺として、または他のコンテキストで発生することはないことに注意してください。お気づきのとおり、参照では空白は無視されます。これは、ポインターと同じ動作です。

const

(私の意見では)可能な場合はconstを使用することは常に良い振る舞いです。変数がどのように使用されるかが明確になります。あなたが関数void foo(int & someIntRef)またはを持っているかどうか想像してみてくださいvoid foo(int * someIntPtr)。fooを呼び出すとき、渡した変数が変更されないという保証はありません。たぶん、私が渡している整数は、私が非常に綿密に追跡しているものであり、他の誰かにそれを変更させたくない、または変更させたくないので、の定義を確実にするためにそれをコピーすることを余儀なくされますが、私はそうでfooはないかもしれませんアクセス権さえあり、変数を変更しません。ほとんどの場合、この関数のシグネチャを見た場合、私は関数は私の変数を変更します。また、コンパイラが関数パラメータがconstであることを知っている場合はパフォーマンス上の利点がありますが、C ++を初めて使用する場合は、この時点で正確にどのように/なぜかを気にしない方がよい場合があります。

->演算子

これは、オブジェクトへのポインターのデータメンバーまたはメンバー関数にほとんど常にアクセスする演算子です(カスタムクラスではオーバーライドされる場合がありますが、非常にまれです)。構造体がある場合:

struct Shape
{
    int mSideCount;
};

...

Shape SomeShape;
Shape * ptrShape = &SomeShape;

mSideCountでのデータメンバーにSomeShapeアクセスできますSomeShape.mSideCount。しかし、ptrShapeはどうですか?これはShapeではなく、ポインターです(具体的にはShape *)。*最初に、のような演算子を使用して間接参照する必要があり(*ptrShape).mSideCountます。ちょっと醜いです。生活を楽に->するために、間接参照とメンバーアクセスを組み合わせるために存在しますptrShape->mSideCount

新しい演算子

newオブジェクトにメモリを割り当て、オブジェクトが正しく構築されていることを確認します(オブジェクトの適切なコンストラクターを呼び出します。これは、Shape(){}上記のShapeの例の場合のようなメンバー関数です)。大きな違いは、メモリがどこから来るかです。上記のように変数を作成すると、スタックSomeShapeと呼ばれるメモリのセクションに作成されます(したがって、スタックオーバーフロー)。スタックの最大サイズは通常比較的小さく、ブロック(関数ブラケット、ループブラケット内、ブロックが何であれ)が終了すると、スタックで宣言された変数はすべてなくなるため、他の関数で簡単に使用することはできません。一方、デフォルトでは、ヒープ上のメモリを使用してオブジェクトを作成しますnew、これはより厳密には「システム上のすべてのメモリ」です。メモリ管理とアーキテクチャだけについて書かれた本があるので、これは非常に簡単な紹介です。

他の多くの人が指摘しているように、これらはかなり基本的なc++の概念です。他のあまり一般的ではない言語機能を見ると、すぐにここに戻ってきます。良い本を手に入れ、それを読み、それが言うことをすべて理解し、いくつかの例を実行してから、ここに来て、まだ頭を包むことができないという知識のギャップを埋めてください。私は個人的にc++DietleとDietleが好きですが、何でも役に立ちます。

于 2012-08-31T06:26:31.587 に答える
1

const Event& eとの間に違いはありませんconst Event &e。矢印演算子->は、ポインタに使用されるクラスメンバーアクセス演算子です。

于 2012-08-31T06:28:30.703 に答える
0

このような単純な状況で const を使用する利点は何ですか?

この状況は、定数参照による引数の受け渡しと呼ばれます。値だけで引数を渡すと、その引数のコピーが作成され、そのコピーが関数内で使用されます。定数参照による受け渡しでは、const である関数への参照が渡されます。つまり、オブジェクトはコピーされません。const 部分により、参照引数を変更できないことが保証されます (通常の定数変数を変更できないのと同じ方法で)。

MinHeap *my_heap = new MinHeap();

これが動的メモリ割り当てです。new 演算子は、 type の新しいオブジェクトを配置するためのメモリをヒープ上に作成しますMinHeap。スペースが割り当てられた後、 new 演算子はそのクラスのコンストラクターも呼び出し、my_heapコードに格納するオブジェクトへのポインターを返します。->次に、演算子を使用して、ポインターが指すオブジェクトを変更できます。

これらのことがより詳細に説明されているC++の入門テキストを購入することを本当に検討する必要があります

于 2012-08-31T06:38:41.680 に答える