2

私は C# から C++ に移行したので、C++ ではすべてがおかしいように見えます。誰かが私に説明できるかどうか疑問に思っています.C ++でこれらの種類のインスタンス化を行う理由: 方法1:

ClassA obj1; // this is going to stack

方法 2:

ClassA *obj1 = new ClassA(); //this is going to heap

一方、c++ では C# の方法で一般的なインスタンス化を行いません。

ClassA  obj2 = new obj2();

そして、method1 でもう 1 つ質問があります。ClassA からインスタンスを取得しますが、() を使用せずに、これがまさに混乱した場所です。なぜそのように開始する必要があるのでしょうか。私たちの ClassA にはコンストラクターがありますが、括弧なしでインスタンス化していますか??? なぜそのコンストラクターを呼び出すのですか?

ps: 私はこれらのトピックを読みました:

C++ でオブジェクトをインスタンス化するためのさまざまな方法

C++ のスタック、静的、およびヒープ

スタックとヒープとは何ですか?

4

3 に答える 3

3

確かに、JavaやC#のような言語からC ++に移行するのは気が遠くなるかもしれませんが、私もそれを経験しました。

何よりも重要な違いは、C ++では、ほとんどの場合、自分のメモリを管理することです。ヒープ上にオブジェクトを作成するときは、メモリをリークしないようにオブジェクトを削除する必要があります。これは、適切と思われるときにオブジェクトを削除できることを意味します。スタック上にオブジェクトを作成する場合、スコープ外になると自動的に削除されます。スコープ外になった後は使用しないように注意する必要があります。

例:

void do_queue(B& queue)
{
    Evt *e = new Evt;
    queue.queueEvent(e); 
} // all well, e can be popped and used (also must be deleted by someone else!)

void do_queue(B& queue)
{
    Evt e;
    queue.queueEvent(&e); 
} // e is out of scope here, popping it from the queue and using it will most likely cause a sigseg

そうは言っても、2つの方法は、1つの側面でも大きく異なります。最初の方法は、オブジェクトを作成します。2つ目は、オブジェクトへのポインタを作成します。ポインタを使用することの良い点は、スタックにコピーされるメモリを最小限に抑えて、ポインタをパラメータとして渡すことができることです(オブジェクト全体ではなく、ポインタがコピーされます)。もちろん、「&」を使用してスタックに割り当てられたオブジェクトのアドレスをいつでも取得したり、参照として渡すことができます。ただし、スタックに割り当てられたオブジェクトを使用する場合は、そのスコープに特に注意してください。

JavaからC++に移行したとき、このWebサイトは素晴らしいリソースであることがわかりました。http://www.parashift.com/c ++ -faq-lite /-おそらくそれも見つかるでしょう、それは多くの良い説明を提供します

于 2010-01-05T08:29:06.603 に答える
2

C ++では、オブジェクトを配置する場所を決定する必要があります。ここで、どのメモリ、スタック、またはヒープを意味します。

オブジェクトのインスタンス化は2段階のプロセスです。最初にメモリが必要です。それをスタックに取り込むか、ヒープから割り当てます。次に、コンストラクター関数を呼び出して、必要な値でメモリを初期化します。つまり、オブジェクトを作成します。

これらの2つの構文は、スタックとヒープという2つの異なるメモリ位置に対応しています。

スタック割り当てオブジェクトの構文と明らかに欠落している括弧に関しては、オブジェクトの定義と構築、および関数の宣言を明確にする必要があります。実際、ClassA obj();パラメーターを受け取らず、ClassAオブジェクトを返す関数を宣言します。

于 2010-01-05T08:29:54.703 に答える
1

C++ 構文はまさにそのようなものです。デフォルトのコンストラクターを使用する場合は、次のように呼び出します。

ClassA obj1;

パラメータを持つコンストラクタがある場合は、次のように呼び出します。

ClassA obj1(5);
于 2010-01-05T08:22:11.227 に答える