2007/05/31(木)VC独自仕様?

^とかいう修飾子が増えてました.
ガベージコレクションできちんと追跡できるようになったポインタのようです.

VS 2005 EEドキュメント中の"C++ Language Reference"に説明が載っていますが,これって.NETの独自拡張ですよね?
CLR用,というかメモリ管理のための拡張が意外と多そうです.
勝手にメモリを解放してもらえるのは楽だけど,仕様がいろいろ追加されていて追いかけるのが大変.

メモ

1: ref class myclass {
2:     int i;
3: };
4: int main(void){
5:     myclass ^obj = gcnew myclass();
6:     int %ti = obj->i;
7:     ti = 100;
8:     return 0;
9: }

1:マネージ型としてクラスを定義
 こうしておくと,マネージドヒープ上にクラスを構築できる.
5:マネージ型はnewではなく,gcnewを使う
 受け取るポインタ側も*ではなく,^を使う
6:マネージドヒープ上の値を参照する場合,&ではなく,%になる

従来のC++で書くとこんな感じ.
メモリ削除をガベージコレクションに任せずに自分で削除する必要がある.

1: class myclass {
2:     int i;
3: };
4: int main(void){
5:     myclass *obj = new myclass();
6:     int &ti = obj->i;
7:     ti = 100;
8:     delete obj;
9:     return 0;
10: }

2007/05/31(木).NET

いつまでのVC6を使ってるのもなんなので,VC++ 2005 EEを使ってみることにしました.
で,最初に思ったこと.

何したらいいの?(汗)

結構,というか,根本的に変わってますね.
今までWindows APIとかMFCでプログラムを組んでいたので,.NETのメソッドは全然わからない.一応,GUIはある程度さわっていたので仕組みは分かるのですが,目的のメソッドがどこにあるのか分かりません.
MSDN ライブラリを参考に作り始めてはみたものの,プログラムを書く時間より,メソッドを探している時間の方が圧倒的に長くなってます.

VS2005 アカデミックなら5000円で買えるので買ってしまおうかな.
って,アカデミックライセンスって大学出ると使えなくなってしまうのかな?
それだと意味無いので無難にStandardのUpgradeのほうがいいのか.

2007/05/23(水)Javaのコンストラクタ

ちょっとJavaのお話が出てきたので,個人的見解を書きつづってみる.

コンストラクタ

コンストラクタを初期化と訳すことは多いけど,実際に行っているのはそのクラスのインスタンスの“構築”.
メモリ中から必要な分だけ確保してインスタンスとし,インスタンス中のデータメンバに初期値を代入することができます.
このことから,初期化も行っているにすぎません.
(Javaのマニュアル中でも,コンストラクタ中では“構築”と表現して,“初期化”とは表現していないはずです.)

インスタンスにおける初期化はイニシャライザで行います.

public class a {
	{
		x = 1;
		y = 2;
	};
	public int x, y;

	public a(){};
	public static void main(String args[]){
		a data = new a();
		System.out.printf("%d %d", data.x, data.y);
	}
}

ここにある無名のメソッドがイニシャライザになります.

また,利用するクラスによっては,構築後に初期化が必要な場合もあります.
特に,ネットワーク接続系のクラスに多いようで,接続後,相手に合わせてこちらのデータメンバを初期化し直す必要があったりします.
この場合,通常initというメソッドをオーバーライドし,初期化処理を行うことになります.

ちなみに,インスタンスが破棄されるときにはデストラクタ(ファイナライザ)が実行されます.

インスタンス

インスタンスとはオブジェクトに近い概念です.
どちらかというと,インスタンスは実体,オブジェクトは概念的な意味合いが強い気がします.

メソッド

関数の一種でインスタンスに対する操作手続き?かな.
純粋に関数といった場合,クラス中のstaticメンバなどのインスタンスに依存しないメソッドでしょうか.