最近のプログラミング言語はオブジェクト指向が当然で、そうでない方が珍しいのですが、割と初期の段階でオブジェクト指向化を果たしたC++のソースを最近見ると、けっこう違和感があるのでした。
この違和感は何だろうと思って考えましたら、宣言と実装が分かれている、そこなんですね。
C++はC言語の流れを汲んでいますので、宣言はヘッダファイルという別ファイルに書いておき、実装はソースファイルに書くことになっています。たとえば、こんな感じです。
hoge.hpp
class Hoge {
private:
int Foo;
public:
Hoge();
void HogeHoge();
}
hoge.cpp
#include "hoge.hpp"
Hoge::hoge()
{
Foo = 0;
}
void Hoge::HogeHoge()
{
cout << Foo;
}
クラスを使いたければ、ヘッダファイルをインクルードします。これはまったくC言語と同じです。
source.cpp
#include "hoge.hpp"
void main()
{
Hoge hoge;
hoge.HogeHoge();
}
しかし、新しいオブジェクト指向言語では、宣言と実装は一心同体です。こんな感じです。
hoge.cs
namespace Hoge {
public class Hoge {
private int Foo;
public void HogeHoge() {
console.WriteLine( Foo );
}
}
}
クラスを使いたければ、このソースファイルをインポートします(表現は言語によって異なる)。
using Hoge;
Hoge hoge = new Hoge();
hoge.HogeHoge();
今から見れば、宣言と実装を別にする必要がなく、非常に理にかなっています。C++もこうしたかったのでしょうが、C言語との互換性を優先してこのような仕様に落ち着いたのでしょう。
ちなみに、C++の流れを汲んだはずのJavaでは、宣言と実装は一心同体です。しかも、まったくクラスを使わずにはコードを一行も書けません。
当たり前のことを何を今さらと言われましょうが、長年のC++プログラマーにはハッとなった事実なのでした。