C++では、
動的なメモリ割り当てとは別に、次の2行のコード間に機能的な違いがあります。
Time t (12, 0, 0); //t is a Time object
Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object
もちろん、Time(int、int、int)アクターが定義されていると仮定しています。また、2番目のケースでは、tがヒープに割り当てられたため、削除する必要があることも認識しています。他に違いはありますか?
この線:
_Time t (12, 0, 0);
_
...タイプTime
の変数をローカルスコープ、一般的にに割り当てます。スタックはスコープが終了すると破棄されます。
対照的に:
_Time* t = new Time(12, 0, 0);
_
... ::operator new()
またはTime::operator new()
のいずれかを呼び出してメモリブロックを割り当て、続いてthis
をその中のアドレスに設定してTime::Time()
を呼び出しますメモリブロック(およびnew
の結果として返される)は、t
に格納されます。ご存知のように、これは一般的にヒープで行われ(デフォルト)、後でプログラムでdelete
する必要がありますが、t
のポインターは- 通常スタックに保存されます。
もう1つの明らかな違いは、tの変数とメソッドにアクセスする場合です。
Time t (12, 0, 0);
t.GetTime();
Time* t = new Time(12, 0, 0);
t->GetTime();
コンストラクターに関する限り、2つの形式は機能的に同じです。新しく割り当てられたオブジェクトインスタンスでコンストラクターが呼び出されるだけです。割り当てモードとオブジェクトの有効期間の違いをすでに十分に把握しているようです。
あなたはすでにすべての違いを理解していると思います。ポインターと変数を介してtのメンバーにアクセスする構文の違いをよく知っていると仮定します(まあ、ポインターも変数ですが、私はあなたが私が意味することを理解していると思います)。また、関数にtを渡すときに、値による呼び出しと参照による呼び出しの違いを知っていると仮定します。また、tを別の変数に割り当て、その別の変数を介して変更を加えるとどうなるかを理解していると思います。結果は、tがポインターかどうかによって異なります。
いいえ ..他の違いはありません。
既に知っていることと他の違いはありません。
コードがデフォルト演算子newのサービスを使用していると仮定します。
オブジェクトをスタックに割り当てても、ヒープに割り当てても、オブジェクトに機能的な違いはありません。どちらもオブジェクトのコンストラクターを呼び出します。
ちなみに、ヒープに割り当てるときにも機能的に同等であるboostのshared_ptrまたはscoped_ptrを使用することをお勧めします(scoped_ptrの追加の有用性により、コピーできないポインターのコピーが制限されます)。
scoped_ptr<Time> t(new Time(12, 0, 0));