質問: c++の例題に分からないところがありました
回答: 最初の:m_a(0)と:m_a(a)の部分はメンバイニシャライザという部分で言葉通りにメンバを初期化する部分です。メンバ変数の値を初期化する場合は普通にコンストラクタ内に m_a = 0; とか m_a = a; という風に書く方法がありますがこれと同じことをメンバイニシャライザを使って行うことができます。以下のように複数の変数を初期化することもできます。 クラス名(): 変数名1(初期値1), 変数名2(初期値2), 変数名3(初期値3) {} 普通の変数を初期化する場合はメンバイニシャライザを使っても使わなくてもどちらでもよいですがconstメンバ変数の場合は必ずメンバイニシャライザを使って初期化しなければなりません。 もう一つの((void*)p) CTest(3)の部分はplacement newや配置newと呼ばれるものです。配置newは普通のnewと違ってメモリを確保しません。 配置newが返すアドレスは指定したアドレスと全く同じなので普通の構造体や変数の場合は単なる型キャストですのでわざわざnewを使って書く必要がありません。 ただしアドレスをクラス型のポインタにキャストする場合、単にキャストしただけではメモリ領域が元のままになってしまうため、主にこのような状況でコンストラクタを呼ぶために使われます。 見ればわかりますが配置newの使い方は以下のようになります。 a = new (void*型アドレス) クラス名([引数], ...); 追記: 例えばすでに確保してある配列などのメモリ領域にオブジェクトを配置したい場合は char array[256]; CTest *q = new ((void*)array) CTest(3); というようになります。この場合、qに入っているアドレスと配列arrayの先頭アドレスは全く同じです。CTestのオブジェクトのサイズが4だった場合array[0]からarray[3]まではCTestクラスのメンバ変数が置かれていてそれらはCTestのコンストラクタによって初期化されています。ます。array[0]からarray[3]までを勝手にいじると当然qも同じアドレスを指しているのでq->getParam()の値も変わってきます。 この場合は配置newによってローカル変数のarray[0]からarray[3]までにCTestのオブジェクトを配置しただけですのでdeleteをどこかに書く必要はありません。 通常の配置newはこのように配列などのまとまったメモリ領域のどこかにオブジェクトを配置するときに使われるのでもともと書いてあった普通のnewで確保した領域に配置newを使って新たにオブジェクトを配置するサンプルだけではわかりずらいかもしれません。