いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

補足びっくりどっきり

さて、昨日のびっくりどっきりソースコードですが、一応自分なりに解釈した解説を。間違ってたら、どなたか突っ込んでください。^^;

static const class A
{
  int m_n;
public:
  A(int n) : m_n(n){}
}* GetClassA()
{
  return new A(0);
}
ですが、これはつまりは、(メンバ変数とか消してしまいますが)

class A
{
public:
  A(int n):
};

const A* GetClassA()
{
  return new A(0);
}

です。
これなら読みやすいですね。

さて、思い出してほしいことは、C言語を勉強していた頃に次のような記述をしたことがありませんか?

struct Test
{
   int nDummy;
} g_sTest; // struct Test な グローバル変数 g_sTest

型と変数の定義を同時にしているみたいなコードですね。
これを「変数」じゃなくて「関数」に当てはめたのが一番上のコードです。徐々に変形させていくと…

class A
{

} GetAObj(); // Aを返す関数宣言

-- ↓ --------------------------

class A
{

} GetAObj() // Aを返す関数定義
{
  return A();
}

-- ↓ --------------------------

class A
{

}* GetAObj() // A* を返す関数
{
  return new A;
}

-- ↓ --------------------------

const class A
{

}* GetAObj() // const A* を返す関数
{
  return new A;
}

-- ↓ --------------------------

static const class A
{

}* GetAObj() // const A* を返す staticな関数
{
  return new A;
}

う〜ん……しかし、何回見ても奇妙なコードに見えますな…こりゃ。(笑
ちなみに、このコード書いてて、微妙に怪しいコードを見つけたので、またネタ切れしたときにでも書いてみようかと思います。

…さーて。ブログも更新し終わったことだし、院生になるための課題をやらなくてはっ。計2,500文字 の文章を書かなきゃいけないんですが…ちょっと大変だなぁ〜。文章じゃなくて、ソースコードだったらうれしかったんだけどなー。^^;