名前空間を説明する前に、
グローバル変数とグローバル関数の説明をします。
1つのプログラムの中に同じグローバル変数名が複数あると
コンパイルエラーとなってしまいます。
さらに、同じように
1つのプログラムの中に同じグローバル関数名が複数あると
コンパイルエラーとなってしまいます。
これは当然の事ですが、プログラムの規模が大きくなってきて
複数人での開発となった場合、
グローバル変数名、グローバル関数名が
衝突しない様に、気をつかう事となります。
プログラマ自身が気をつけなければならないため、
バグの温床となります。
名前空間
このグローバル変数、グローバル関数の名前の管理のために
用意された機能が名前空間機能です。
名前空間には、好きな名前をつける事ができ、
その名前空間がWindowsのフォルダのような機能を提供します。
例えば、1つのフォルダの中に
同じファイル名のファイルは作れません。
しかし、異なるフォルダ間であれば、
同じファイル名があっても大丈夫です。
これと同じように、
1つのプログラムの中に同じグローバル変数名は作れません。
しかし、異なる名前空間であれば、
同じグローバル変数名があっても大丈夫です。
と言う事です。(もちろん、グローバル関数も同様です。)
つまり、1つのプログラムの中に
擬似的なフォルダ機能を提供しているワケです。
なんとなくイメージがつかめたでしょうか?
実際のコード例を書いてみます。
#include <iostream>
using namespace std;
namespace aaa {
int a = 10;
void show(void);
}
namespace bbb {
int a = 5;
void show(void);
}
void main(void) {
aaa::show();
bbb::show();
}
namespace aaa {
void show(void) {
cout << "名前空間aaaのグローバル変数a=" << aaa::a << '\n';
}
}
namespace bbb {
void show(void) {
cout << "名前空間bbbのグローバル変数a=" << bbb::a << '\n';
}
}
このプログラム例では、
名前空間aaaと名前空間bbbを使っています。
それぞれの名前空間内に
グローバル変数aとグローバル関数showが含まれています。
名前は同じですが、異なる名前空間内に配置されているので、
両者は全く別物であり、区別されます。
それぞれの名前空間内のグローバル変数や関数を指定するには、
スコープ解決演算子(::)を使用します。
この演算子により、
個々の名前空間内の変数や関数を指定する事ができます。
また、このプログラムには、同じ名前空間が含まれています。
例えば名前空間aaaや名前空間bbb。
これらは、名前空間内の記述を分割できる事を示していて、
別ファイルでも同じ名前空間の記述が可能になります。
名前空間のネスト
名前空間内に名前空間を作る事もできます。
もちろん、それぞれの名前空間内の変数名、関数名は
別モノとして扱われます。
namespace aaa {
int a = 5;
void show(void);
namespace bbb {
int a = 10;
void show(void);
}
}
void main(void) {
aaa::bbb::show();
}
名前空間の活用例
名前空間機能の活用例としては、
佐藤君、鈴木君、田中君の3人で
1つのアプリケーション開発しているとしたら、
それぞれに固有の名前空間を割り当てて担当する。
例えば、佐藤君が作る全てプログラムは、
名前空間satou内で作るものとする。
以下、鈴木君と田中君も同じようにすれば、
それぞれが作ったプログラムを合わせた時に、
変数名や関数名の衝突がない事が
名前空間機能によって保証されているので、
そのような事を気をする必要がなくなります。
以上、名前空間の解説でした。
名前空間はとても便利な機能ですので、是非使ってみて下さい。