これの違いは何ですか:
Myclass *object = new Myclass();
そして
Myclass object = new Myclass();
WxWidgets、OGREなどの多くのC++ライブラリが最初の方法を使用しているのを見ました...なぜですか?
二番目は間違っています!
使用してもよい
MyClass object;
それは動作します。
さて、これらの2つの可能性の間でどのように選択するかに関して、それは主にオブジェクトがどれくらい長く生きるべきかに依存します。完全な答えについては there をご覧ください。
Myclass *object = new Myclass(); //object has dynamic storage duration (usually is on the heap)
Myclass object; //object has automatic storage duration (usually is on the stack)
長期間にわたってオブジェクトを使用する予定の場合、動的ストレージ期間(通常はヒープ上)でオブジェクトを作成し、短い有効期間(またはスコープ)で自動ストレージ期間(通常はスタック上)でオブジェクトを作成します。
最初の行は100%正しいです。残念ながら、c ++の2行目ではオブジェクトを作成できません。 C++でオブジェクトを作成/作成するには2つの方法があります。
最初のものは:
MyClass myclass; // if you only need to call the default constructor
MyClass myclass(12); // if you need to call constructor with parameters*
2つ目は次のとおりです。
MyClass *myclass = new MyClass();// if you only need to call the default constructor
MyClass *myclass = new MyClass(12);// if you need to call constructor with parameters
C++では、new
キーワードを使用すると、オブジェクトはヒープに格納されます。このオブジェクトを長期間使用している場合、および最初のメソッドを使用する場合は、スタックに保存されます。短期間しか使用できません。注意:new
キーワードを使用する場合、ポインター値を返すことに注意してください。 *
で名前を宣言する必要があります。 2番目の方法を使用する場合、ヒープ内のオブジェクトは削除されません。 delete
キーワードを使用して自分で削除する必要があります。
delete myclass;
new
演算子は、作成するオブジェクトへのポインタを返すため、式Myclass object = new Myclass();
は無効です。
他の言語にはC++のような明示的なポインターがないため、Myclass object = new Myclass();
のようなステートメントを記述できますが、C++ではこれは単に不可能です。 new Myclass();
の戻り値の型は、Myclass
オブジェクトへのポインター、つまりMyclass *
。
最初の例では、MyClassへのポインターを作成し、new演算子の結果を指すように初期化します。
2番目は、MyClassオブジェクトを作成してMyClassポインターに割り当てようとしているため、おそらくコンパイルされません。これは、MyClassポインターを受け入れるMyClassコンストラクターがあるというまれなイベントで機能する可能性があります。
最初のコード行は正しく、2番目のコード行は正しくありません。
Myclass object=new Myclass(); //Incorrect code
new Myclass();クラスへのポインターを返し、Myclass object;がクラスのオブジェクトを宣言し、クラスへのポインターをクラスのオブジェクトに割り当てようとしているため、上記のコードは正しくありません、これは正しくありません。
最初のコード行は正しいです。しかし、これはクラスのオブジェクトではなく、クラスへのポインタを宣言します。
Myclass *object = new Myclass(); //declares pointer to class.
クラスのオブジェクトを宣言するには、次のコードを記述する必要があります。
Myclass object; //declares object of class Myclass
ただし、クラスへのポインターを使用してクラスメンバーにアクセスする方法とクラスのオブジェクトを使用する方法は異なることに注意してください。以下は、クラスのメンバーにアクセスするためのコードです。
pointer_to_class->member; // accessing class member using pointer to class
object.member; //accessing class member using object of class
最初は正しいです。
通常、2番目はコンパイルされません。そして、コンパイルする場合、クラスはコンストラクター/割り当て演算子でいくつかの複雑なことをしています。そして、おそらくメモリがリークしています。