質問

私は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つの質問1私はクラスからインスタンスを取得しますが、()がありません。これは私が混乱している正確な場所です、なぜ私たちはそのように設立しなければならないのですか?私たちのクラスにはコンストラクターがありますが、括弧なしでインスタンス化されていますか?どうして私たちはそのコンストラクターと呼ぶのですか?

PS:これらのトピックを読みました:

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

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

スタックとヒープはどこにありますか?

役に立ちましたか?

解決

実際、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 ++に移ったとき、このウェブサイトは素晴らしいリソースであることがわかりました。 http://www.parashift.com/c++faq-lite/ - あなたもおそらくそれを見つけるでしょう、それは多くの良い説明を提供します

他のヒント

C ++では、オブジェクトをどこに存在させたいかを決定する必要があります。どのメモリ、スタック、またはヒープを意味します。

オブジェクトをインスタンス化することは、2つのステッププロセスです。まず、メモリが必要で、スタックでそれを取るか、ヒープから割り当てます。次に、コンストラクター関数を呼び出すことにより、必要な値でメモリを初期化します。つまり、オブジェクトを構築します。

これらの2つの構文は、これらの2つの可能な異なるメモリの位置のためのスタックとヒープです。

スタック割り当てられたオブジェクトの構文と明らかに欠落している括弧については、オブジェクトの定義と構築、および関数の宣言との間を明確にすることです。それはそう、 ClassA obj(); パラメーターを使用しない関数を宣言し、クラスオブジェクトを返します。

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

ClassA obj1;

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

ClassA obj1(5);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top